将所有变量转换为保持等级NA的因子

时间:2015-11-10 10:35:40

标签: r apply factors

我已经回顾了很多关于此事的主题,但我遗漏了一些东西 - 我在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功能,则可以正常运行:

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"

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

(如果答案很容易,我很抱歉 - 我经历了很多主题并没有找到它)

1 个答案:

答案 0 :(得分:2)

除非您使用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))

代码难以理解,但是当您处理大量数据集时,这应该非常有效。