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
NAdepois 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.