将所有变量转换为保持水平 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))
代码更难理解,但当您处理庞大的数据集时,这应该非常有效。
我已经回顾了很多关于这个问题的主题,但我遗漏了一些东西——我假设 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))
代码更难理解,但当您处理庞大的数据集时,这应该非常有效。