猿问

如何在不丢失信息的情况下将因子转换为整数\数字?

如何在不丢失信息的情况下将因子转换为整数\数字?

当我将因子转换为数字或整数时,我得到基础级别代码,而不是值作为数字。


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

我不得不求助于paste获得真正的价值观:


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

有没有更好的方法将因子转换为数字?


慕雪6442864
浏览 897回答 3
3回答

牧羊人nacy

请参阅以下警告部分?factor:特别是,as.numeric应用于一个因素是没有意义的,并且可能通过隐式强制发生。要将因子转换f为大约其原始数值,as.numeric(levels(f))[f]建议使用效率稍高一些as.numeric(as.character(f))。关于R的FAQ&nbsp;有类似的建议。为什么as.numeric(levels(f))[f]比这更有效as.numeric(as.character(f))?as.numeric(as.character(f))是有效的as.numeric(levels(f)[f]),因此您正在执行转换为数字length(x)值而不是nlevels(x)值。对于具有较少水平的长向量,速度差异将是最明显的。如果这些值大多是唯一的,那么速度就没有太大差异。但是,如果进行转换,此操作不太可能成为代码中的瓶颈,因此不要过于担心。一些时间library(microbenchmark)microbenchmark(&nbsp; as.numeric(levels(f))[f],&nbsp; as.numeric(levels(f)[f]),&nbsp; as.numeric(as.character(f)),&nbsp; paste0(x),&nbsp; paste(x),&nbsp; times = 1e5)## Unit: microseconds##&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;expr&nbsp; &nbsp;min&nbsp; &nbsp; lq&nbsp; &nbsp; &nbsp; mean median&nbsp; &nbsp; &nbsp;uq&nbsp; &nbsp; &nbsp; max neval##&nbsp; &nbsp; &nbsp;as.numeric(levels(f))[f] 3.982 5.120&nbsp; 6.088624&nbsp; 5.405&nbsp; 5.974 1981.418 1e+05##&nbsp; &nbsp; &nbsp;as.numeric(levels(f)[f]) 5.973 7.111&nbsp; 8.352032&nbsp; 7.396&nbsp; 8.250 4256.380 1e+05##&nbsp; as.numeric(as.character(f)) 6.827 8.249&nbsp; 9.628264&nbsp; 8.534&nbsp; 9.671 1983.694 1e+05##&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; paste0(x) 7.964 9.387 11.026351&nbsp; 9.956 10.810 2911.257 1e+05##&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;paste(x) 7.965 9.387 11.127308&nbsp; 9.956 11.093 2419.458 1e+05

qq_花开花谢_0

R有许多(未记录的)便利函数用于转换因子:as.character.factoras.data.frame.factoras.Date.factoras.list.factoras.vector.factor...但令人讨厌的是,没有什么可以处理因素 - >数字转换。作为约书亚乌尔里希答案的延伸,我建议用你自己惯用函数的定义来克服这个遗漏:as.numeric.factor&nbsp;<-&nbsp;function(x)&nbsp;{as.numeric(levels(x))[x]}您可以存储在脚本的开头,甚至可以存储在.Rprofile文件中。

慕尼黑5688855

最简单的方法是使用unfactorpackage&nbsp;varhandle中的函数unfactor(your_factor_variable)这个例子可以快速入门:x <- rep(c("a", "b", "c"), 20)y <- rep(c(1, 1, 0), 20)class(x)&nbsp; # -> "character"class(y)&nbsp; # -> "numeric"x <- factor(x)y <- factor(y)class(x)&nbsp; # -> "factor"class(y)&nbsp; # -> "factor"library(varhandle)x <- unfactor(x)y <- unfactor(y)class(x)&nbsp; # -> "character"class(y)&nbsp; # -> "numeric"
随时随地看视频慕课网APP
我要回答