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

标签 r data.table r-factor

我想将 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/

相关文章:

r - 查找给定特征值R的特征向量

r - 如何根据一组不等式约束对 data.table 进行排序?

r - 将具有未见字符串值的新记录 append 到数据帧时出现未见因子级别,导致警告并导致 NA

r - ggplot2 可以找到交叉点 - 还是有其他巧妙的方法?

r - 尝试计算相关矩阵时如何解释此错误的含义?

r - R 中特定值的计数器顺序

r - 当我附加到向量时,为什么我的角色会发生变化?

r - 如何将数据框的某些列转换为因子?

r - 年份变量应该是 R 面板数据中的因子还是数字?

带条件语句的前一行的 R data.table 值