我可以以编程方式更新data.table中的一组列(到因子)的类型吗?

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给它的列.

为了区分这两种情况,我们需要().将其包装()足以确定我们确实需要获取变量中的值.