我有一个data.table,我想用它对某些列执行相同的操作。这些列的名称在字符 vector 中给出。在此特定示例中,我想将所有这些列乘以-1。

一些玩具数据和一个指定相关列的 vector :

library(data.table)
dt <- data.table(a = 1:3, b = 1:3, d = 1:3)
cols <- c("a", "b")

现在,我正在用这种方式,遍历字符 vector :
for (col in 1:length(cols)) {
   dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
}

有没有一种方法可以直接执行此操作而无需for循环?

最佳答案

这似乎可行:

dt[ , (cols) := lapply(.SD, "*", -1), .SDcols = cols]

结果是
    a  b d
1: -1 -1 1
2: -2 -2 2
3: -3 -3 3

这里有一些技巧:
  • 因为(cols) :=中有括号,所以结果将分配给cols中指定的列,而不是分配给一些名为“cols”的新变量。
  • .SDcols告诉调用我们只查看这些列,并允许我们使用.SD,即与那些列关联的S ata的D ubset。
  • lapply(.SD, ...).SD进行操作,lapply是列的列表(如所有data.frames和data.tables)。 j返回一个列表,因此cols := list(...)最后看起来像ojit_code。

  • 编辑:这是另一种可能更快的方法,如@Arun所述:
    for (j in cols) set(dt, j = j, value = -dt[[j]])
    

    关于r - 如何将相同的功能应用于data.table中的每个指定列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16846380/

    10-12 19:13