Quando converto um fator em um numérico ou número inteiro, obtenho os códigos de nível subjacentes, não os valores como números.
f <- factor(sample(runif(5), 20, replace = TRUE))
## [1] 0.0248644019011408 0.0248644019011408 0.179684827337041
## [4] 0.0284090070053935 0.363644931698218 0.363644931698218
## [7] 0.179684827337041 0.249704354675487 0.249704354675487
## [10] 0.0248644019011408 0.249704354675487 0.0284090070053935
## [13] 0.179684827337041 0.0248644019011408 0.179684827337041
## [16] 0.363644931698218 0.249704354675487 0.363644931698218
## [19] 0.179684827337041 0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218
as.numeric(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
as.integer(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
Eu tenho que recorrer paste
para obter os valores reais:
as.numeric(paste(f))
## [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493
## [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901
## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493
## [19] 0.17968483 0.02840901
Existe uma maneira melhor de converter um fator para numérico?
attributes(f)
), então não acho que haja algo erradoas.numeric(paste(f))
. Talvez seja melhor pensar por que (no contexto específico) você está recebendo um fator em primeiro lugar e tentar impedir isso. Por exemplo, odec
argumento estáread.table
definido corretamente?df %>% convert(num(column))
. Ou se você tiver um vetor fator que você pode usaras_reliable_num(factor_vector)
Respostas:
Consulte a seção Aviso de
?factor
:O FAQ sobre R tem conselhos semelhantes .
Por que é
as.numeric(levels(f))[f]
mais eficaz queas.numeric(as.character(f))
?as.numeric(as.character(f))
é efetivamenteas.numeric(levels(f)[f])
, portanto, você está realizando a conversão emlength(x)
valores numéricos em vez denlevels(x)
valores. A diferença de velocidade será mais aparente para vetores longos com poucos níveis. Se os valores forem principalmente únicos, não haverá muita diferença de velocidade. Seja como for a conversão, é improvável que essa operação seja o gargalo no seu código, portanto, não se preocupe muito com isso.Alguns horários
fonte
R possui várias funções de conveniência (não documentadas) para fatores de conversão:
as.character.factor
as.data.frame.factor
as.Date.factor
as.list.factor
as.vector.factor
Mas irritantemente, não há nada para lidar com o fator -> conversão numérica . Como uma extensão da resposta de Joshua Ulrich, sugiro superar essa omissão com a definição de sua própria função idiomática:
que você pode armazenar no início do seu script, ou ainda melhor no seu
.Rprofile
arquivo.fonte
as.integer(factor)
retorne os códigos inteiros subjacentes (como mostrado na seção de exemplos de?factor
). Provavelmente, não há problema em definir essa função em seu ambiente global, mas você poderá causar problemas se realmente registrá-la como um método S3.factor->numeric
de conversão muito antes de perceber que na verdade é uma lacuna de R: alguns função de conveniência deve estar disponível ... Chamar issoas.numeric.factor
faz sentido para mim, mas YMMV.v=NA;as.numeric.factor(v)
ouv='something';as.numeric.factor(v)
, então deveria, caso contrário, você tem algo estranho acontecendo em algum lugar.A maneira mais fácil seria usar a
unfactor
função do pacote varhandleEste exemplo pode ser um começo rápido:
fonte
unfactor
função converte primeiro para o tipo de dados de caractere e depois converte novamente para numérico. Digiteunfactor
no console e você poderá vê-lo no meio da função. Portanto, ele realmente não dá uma solução melhor do que o que o solicitante já tinha.unfactor
função cuida de coisas que não podem ser convertidas para numéricas. Veja os exemplos emhelp("unfactor")
library("varhandle")
) primeiro (como mencionei na primeira linha da minha resposta !!)as.numeric()
eas.character()
em uma ordem errada;) O que o seu pedaço de código faz é transformar o índice de nível do fator em uma matriz de caracteres, então o que você terá no e é um vetor de caractere que contém alguns números que já foram atribuídos a determinado nível do seu fator. Funções em que o pacote está lá para evitar essas confusõesNota: esta resposta específica não é para converter fatores de valor numérico em numéricos, é para converter fatores categóricos em seus números de nível correspondentes.
Todas as respostas deste post falharam em gerar resultados para mim, os NAs estavam sendo gerados.
O que funcionou para mim é isso -
fonte
y<-factor(c("5","15","20","2")); unclass(y) %>% as.numeric
Isso retorna 4,1,3,2, não 5,15,20,2. Parece informação incorreta.as.numeric(y)
deveria ter funcionado bem, sem a necessidade deunclass()
. Mas, novamente, não é disso que se trata essa pergunta. Esta resposta não é apropriada aqui.É possível apenas no caso em que os rótulos dos fatores correspondam aos valores originais. Vou explicar com um exemplo.
Suponha que os dados sejam vetoriais
x
:Agora vou criar um fator com quatro rótulos:
1)
x
é do tipo double,f
é do tipo inteiro. Esta é a primeira perda inevitável de informações. Os fatores são sempre armazenados como números inteiros.2) Não é possível voltar aos valores originais (10, 20, 30, 40) apenas
f
disponíveis. Podemos ver quef
possui apenas valores inteiros 1, 2, 3, 4 e dois atributos - a lista de rótulos ("A", "B", "C", "D") e o atributo de classe "fator". Nada mais.Para voltar aos valores originais, precisamos conhecer os valores dos níveis usados na criação do fator. Nesse caso
c(10, 20, 30, 40)
. Se conhecermos os níveis originais (na ordem correta), podemos voltar aos valores originais.E isso funcionará apenas no caso em que os rótulos tenham sido definidos para todos os valores possíveis nos dados originais.
Portanto, se você precisar dos valores originais, precisará mantê-los. Caso contrário, há uma grande chance de que não seja possível retornar a eles apenas por um fator.
fonte
Você pode usar
hablar::convert
se você tiver um quadro de dados. A sintaxe é fácil:Amostra df
Solução
da-te:
Ou se você deseja que uma coluna seja inteira e uma numérica:
resulta em:
fonte
Parece que a solução como.numeric (levels (f)) [f] não funciona mais com o R 4.0.
Solução alternativa:
fonte
Das muitas respostas que pude ler, a única maneira dada era expandir o número de variáveis de acordo com o número de fatores. Se você tiver uma variável "pet" com os níveis "dog" e "cat", você terminará com pet_dog e pet_cat.
No meu caso, eu queria ficar com o mesmo número de variáveis, apenas convertendo a variável fator para uma numérica, de uma maneira que possa ser aplicada a muitas variáveis com muitos níveis, de modo que cat = 1 e dog = 0, por exemplo.
Encontre a solução correspondente abaixo:
fonte
tarde para o jogo, acidentalmente, eu encontrei
trimws()
pode converterfactor(3:5)
parac("3","4","5")
. Então você pode ligaras.numeric()
. Isso é:fonte
trimws
mais,as.character
conforme descrito na resposta aceita? Parece-me que, a menos que você realmente tenha um espaço em branco que precise remover,trimws
apenas fará um monte de trabalhos desnecessários de expressão regular para retornar o mesmo resultado.