HOWTO · R

Converter um fator em valores numéricos no R

Aprenda a converter fatores do R em rótulos numéricos com segurança, distinguir códigos de valores e tratar rótulos inválidos.

Nesta página

Use as.numeric(as.character(f)) quando um fator f contiver rótulos numéricos e você precisar desses rótulos como números. Já a chamada direta a as.numeric(f) retorna os códigos inteiros internos do fator. A conversão direta só é útil quando esses códigos são usados deliberadamente como identificadores de categoria.

Entender o que as.numeric retorna para um fator

Os fatores do R contêm códigos inteiros e um conjunto separado de níveis de caracteres. Os códigos apontam para os níveis em sua ordem classificada ou explicitamente definida; eles não são automaticamente as medições originais. Você pode examinar as duas partes com levels() e unclass().

A saída de as.numeric(f) é uma sequência de códigos como 2 1 2 3. Isso não significa que os valores originais fossem 2, 1, 2 e 3. Essa distinção é importante quando um data frame importa como fator uma coluna que parece numérica.

Converter rótulos numéricos de um fator em números

Primeiro converta o fator em caracteres e depois converta os rótulos em valores numéricos:

f <- factor(c("3", "2", "3", "4"))
values <- as.numeric(as.character(f))
values

Para um fator cujos níveis sejam comprovadamente numéricos, as.numeric(levels(f))[f] é uma alternativa eficiente. As duas abordagens recuperam os rótulos, e não os códigos internos. A conversão primeiro para caracteres costuma ser mais legível e deixa explícitas as duas etapas.

Rótulos numéricos decimais e negativos funcionam da mesma forma. Faça a conversão perto da etapa de importação ou limpeza e verifique o resultado com str() ou class() antes de usá-lo em cálculos.

Codificar rótulos categóricos de forma intencional

Se os rótulos forem categorias, não trate seus códigos como medições. Defina explicitamente a ordem das categorias quando precisar de um identificador estável:

grade <- factor(c("low", "high", "low"), levels = c("low", "high"))
codes <- as.numeric(grade)
codes

Aqui, 1 e 2 são códigos de categoria porque a ordem foi escolhida explicitamente. Eles não indicam que high seja duas vezes low. Para um mapeamento específico do negócio ou do modelo, uma tabela de consulta nomeada é mais clara:

grade <- c("low", "high", "low")
score <- c(low = 10, high = 20)[grade]
score

Isso mantém visível o significado de cada valor numérico e evita depender da ordem padrão dos níveis do fator.

Tratar rótulos não numéricos, valores ausentes e avisos

A conversão por meio de caracteres não consegue transformar rótulos arbitrários em números. O texto não numérico se torna NA e o R emite um aviso de coerção; um valor que já estava ausente continua ausente:

f <- factor(c("12.5", "oops", NA))
values <- as.numeric(as.character(f))
values
is.na(values)

Considere valores NA inesperados como um sinal de problema na qualidade dos dados. Verifique os rótulos originais, remova ou normalize espaços quando apropriado e decida como tratar registros inválidos antes da análise. Não os substitua silenciosamente por zero. Se os rótulos forem categóricos, e não numéricos, use um mapeamento explícito ou um fator com ordem explicitamente definida.

Verificar a conversão

Antes de confiar no resultado, verifique a classe de origem, os níveis, os valores convertidos e os possíveis avisos. A regra resumida é:

  • use as.numeric(f) para códigos de fator intencionais;
  • use as.numeric(as.character(f)) para rótulos numéricos;
  • use uma ordem explícita ou um mapeamento nomeado para categorias; e
  • examine os valores NA depois de converter texto importado.

O código R moderno deve especificar deliberadamente os tipos de importação ou os níveis do fator, em vez de depender de padrões históricos sobre a conversão de strings em fatores. Essas verificações deixam claro o significado pretendido de cada resultado numérico.