3 回答
TA贡献1862条经验 获得超7个赞
请参阅以下警告部分?factor
:
特别是,
as.numeric
应用于一个因素是没有意义的,并且可能通过隐式强制发生。要将因子转换f
为大约其原始数值,as.numeric(levels(f))[f]
建议使用效率稍高一些as.numeric(as.character(f))
。
关于R的FAQ 有类似的建议。
为什么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(
as.numeric(levels(f))[f],
as.numeric(levels(f)[f]),
as.numeric(as.character(f)),
paste0(x),
paste(x),
times = 1e5
)
## Unit: microseconds
## expr min lq mean median uq max neval
## as.numeric(levels(f))[f] 3.982 5.120 6.088624 5.405 5.974 1981.418 1e+05
## as.numeric(levels(f)[f]) 5.973 7.111 8.352032 7.396 8.250 4256.380 1e+05
## as.numeric(as.character(f)) 6.827 8.249 9.628264 8.534 9.671 1983.694 1e+05
## paste0(x) 7.964 9.387 11.026351 9.956 10.810 2911.257 1e+05
## paste(x) 7.965 9.387 11.127308 9.956 11.093 2419.458 1e+05
TA贡献1848条经验 获得超2个赞
最简单的方法是使用unfactor
package varhandle中的函数
unfactor(your_factor_variable)
这个例子可以快速入门:
x <- rep(c("a", "b", "c"), 20)
y <- rep(c(1, 1, 0), 20)
class(x) # -> "character"
class(y) # -> "numeric"
x <- factor(x)
y <- factor(y)
class(x) # -> "factor"
class(y) # -> "factor"
library(varhandle)
x <- unfactor(x)
y <- unfactor(y)
class(x) # -> "character"
class(y) # -> "numeric"
- 3 回答
- 0 关注
- 896 浏览
添加回答
举报