drs*_*vok 5 r r-factor data.table
我想将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)]
Run Code Online (Sandbox Code Playgroud)
但我没有,而是有一个变量名列表
vars.factors <- c('b','c')
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地将因子函数应用于它们......
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))])
Run Code Online (Sandbox Code Playgroud)
但我不知道如何重新分配或更新数据表中的原始列.
这失败了......
lapply(vars.factors, function(x) dt1[,x:=factor(get(x))])
# Error in get(x) : invalid first argument
Run Code Online (Sandbox Code Playgroud)
就像这样......
lapply(vars.factors, function(x) dt1[,get(x):=factor(get(x))])
# Error in get(x) : object 'b' not found
Run Code Online (Sandbox Code Playgroud)
NB.我试着在这里提出的答案没有任何运气.
Aru*_*run 12
是的,这很简单:
dt1[, (vars.factors) := lapply(.SD, as.factor), .SDcols=vars.factors]
Run Code Online (Sandbox Code Playgroud)
在LHS(of:= in j)中,我们指定列的名称.如果列已存在,则会更新,否则将创建新列.在RHS中,我们遍历所有列.SD(代表D ata的S ubset ),并指定应该与参数一起使用的列..SD.SDcols
跟进评论:
请注意,我们需要包装LHS ()以便对其进行评估并获取vars.factors变量中的列名.这是因为我们允许语法
DT[, col := value]
Run Code Online (Sandbox Code Playgroud)
当只有一列要分配时,通过将列名指定为符号(不带引号),纯粹是为了方便起见.这将创建一个名为col并指定value给它的列.
为了区分这两种情况,我们需要().将其包装()足以确定我们确实需要获取变量中的值.