我想将 data.table 中的一组列修改为因子。如果我事先知道列的名称,我想这会很简单。
library(data.table)
dt1 <- data.table(a = (1:4), b = rep(c('a','b')), c = rep(c(0,1)))
dt1[,class(b)]
dt1[,b:=factor(b)]
dt1[,class(b)]
但我没有,而是有一个变量名称列表
vars.factors <- c('b','c')
我可以毫无问题地将因子函数应用于它们......
lapply(vars.factors, function(x) dt1[,class(get(x))])
lapply(vars.factors, function(x) dt1[,factor(get(x))])
lapply(vars.factors, function(x) dt1[,factor(get(x))])
但是我不知道如何重新分配或更新数据表中的原始列。
这失败了...
lapply(vars.factors, function(x) dt1[,x:=factor(get(x))])
# Error in get(x) : invalid first argument
就像这个...
lapply(vars.factors, function(x) dt1[,get(x):=factor(get(x))])
# Error in get(x) : object 'b' not found
注意。我尝试了建议的答案 here没有任何运气。
最佳答案
是的,这相当简单:
dt1[, (vars.factors) := lapply(.SD, as.factor), .SDcols=vars.factors]
在
LHS
(of := in j
),我们指定列的名称。如果一列已经存在,它将被更新,否则,将创建一个新列。在 RHS 中,我们遍历 .SD
中的所有列。 (代表 S D ata 的子集),我们指定应该在 .SD
中的列与 .SDcols
争论。跟进评论:
请注意,我们需要用
()
包裹 LHS对其进行评估并获取 vars.factors
中的列名多变的。这是因为我们允许语法DT[, col := value]
当只有一列要分配时,通过将列名指定为符号(不带引号),纯粹是为了方便。这将创建一个名为
col
的列并分配 value
到它。为了区分这两种情况,我们需要
()
.用 ()
包裹它足以确定我们确实需要获取变量中的值。
关于r - 我可以以编程方式更新 data.table 中一组列的类型(到因子)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26299159/