将所有变量转换为保持水平 NA 的因子

Convert all variables to factors keeping level NA

我已经回顾了很多关于这个问题的主题,但我遗漏了一些东西——我假设 R 中有一些通用的东西。

基本上我想将数据框中的所有变量转换为因子,同时还使 NA 增加一个级别。

#Creating Data Frame
data<-data.frame(var1=c(1,2,3,3,3,4,NA),var2=c("a","b","c","d",NA,"a","b"))

如果我 运行 factor 使用 exclude 选项仅对一个变量起作用:

levels(factor(data$var1,exclude=NULL))
[1] "1" "2" "3" "4" NA 

如果我使用 apply,则此信息似乎会丢失。这可能是由于 matrix-data.frame 强制

我都试过了:

data.factors<-data.frame(apply(data, 2,x,exclude=NULL))
data.factors<-data.frame(apply(data, 2, function(x) factor(x,exclude=NULL)))

并且结果没有 NA 作为单独的级别:

levels(x.factors$var1)
[1] " 1" " 2" " 3" " 4"

然后我可以在一个单独的步骤中为 NA 添加新级别,但这会增加脚本的数量,我希望它可以一步完成吗? 有什么建议吗?

(如果答案很容易获得,我深表歉意 - 我浏览了很多主题但没有找到)

除非您在 matrix/array 上进行操作或进行按行操作,否则请不惜一切代价避免 apply,因为它会转换为矩阵特征。

lapply 避免了转换部分,效率更高。您还可以使用 [] 更新原始数据集,这样可以保留数据集的原始结构并避免将其转换回列表,如

data[] <- lapply(data, factor, exclude = NULL)

然后,您可以验证

lapply(data, levels)
# $var1
# [1] "1" "2" "3" "4" NA 
# 
# $var2
# [1] "a" "b" "c" "d" NA 

作为奖励,您还可以尝试 data.table::set 函数,这是我最喜欢的此类操作的主力

library(data.table)
for(j in names(data)) set(data, j = j, value = factor(data[[j]], exclude = NULL))

代码更难理解,但当您处理庞大的数据集时,这应该非常有效。