假设我有这个对象,它是无效因子的dput()形式(例如,打印它会抱怨重复级别3):
x <- structure(c(1L, 2L, 3L, 4L), .Label = c("A", "B", "A", "C"),
class = "factor")
什么是最好的方法,只使用基数R,将其转换为有效因子
structure(c(1L, 2L, 1L, 3L), .Label = c("A", "B", "C"), class = "factor")
我设法想出来了
factor(levels(x)[x])
但是我不确定这会在没有警告的情况下继续工作,并且它可能效率也很低(我试图修复的真正因素对象是巨大的).
最佳答案 你的方法似乎很好,效率很高.为了实验,我创建了一个函数来制作这样的畸形因素:
bad.factor <- function(nums,labs){
structure(nums, .Label = labs, class = "factor")}
如果您使用:
x <- bad.factor(1:1000000,gtools::chr(runif(1000000,65,90)))
然后运行:
microbenchmark::microbenchmark(factor(levels(x)[x]))
典型输出是:
Unit: milliseconds
expr min lq mean median uq max neval
factor(levels(x)[x]) 27.72593 32.98346 42.97813 34.11871 35.70919 105.3564 100