我已经回顾了很多关于此事的主题,但我遗漏了一些东西 - 我在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添加一个单独的步骤新级别,但这会增加脚本的数量,我希望它可以一步完成? 有什么建议吗?
(如果答案很容易,我很抱歉 - 我经历了很多主题并没有找到它)
答案 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))
代码难以理解,但是当您处理大量数据集时,这应该非常有效。