Mais
Como converter um fator em integer\numérico sem perda de informação?
Quando converto um fator para um numérico ou inteiro, recebo 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
Tenho de recorrer à "pasta" 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 factor em numérico?
559
3
Veja a seção Aviso de
?fator
:A FAQ sobre R tem conselhos semelhantes.
Porque é
as.numeric(levels(f))[f]
mais eficaz do queas.numeric(as.character(f))
?as.numeric(as.character(f))
é efetivamenteas.numeric(levels(f)[f])
, então você está realizando a conversão para numérico emlength(x)
valores, ao invés de emnlevels(x)
valores. A diferença de velocidade será mais aparente para vetores longos com poucos níveis. Se os valores são na maioria das vezes únicos, haverá uma grande diferença na velocidade. Entretanto você faz a conversão, esta operação é improvável que seja o gargalo no seu código, então não'não se preocupe muito com isso.**alguns horários***
R tem uma série de funções de conveniência (não documentadas) para a conversão de fatores:
as.character.factor
as.list.factor
Mas irritantemente, não há nada para lidar com o factor -> conversão numérica. Como uma extensão da resposta de Joshua Ulrich's, eu sugeriria superar esta omissão com a definição da sua própria função idiomática:
É possível **somente*** no caso em que as etiquetas dos factores coincidam com os valores originais. Vou explicar isso com um exemplo.
Suponha que os dados são vetoriais
x
: