我有一个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/