我有一个 data.table,我想用它对某些列执行相同的操作。这些列的名称在字符向量中给出。在这个特定的示例中,我想将所有这些列乘以 -1。
一些玩具数据和指定相关列的向量:
library(data.table)
dt <- data.table(a = 1:3, b = 1:3, d = 1:3)
cols <- c("a", "b")
现在我正在这样做,循环遍历字符向量:
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
, the S
的子集D
与这些列关联的 ata。
-
lapply(.SD, ...)
运行于.SD
,这是一个列列表(像所有 data.frames 和 data.tables 一样)。lapply
返回一个列表,所以最后j
好像cols := list(...)
.
EDIT:正如 @Arun 提到的,这是另一种可能更快的方法:
for (j in cols) set(dt, j = j, value = -dt[[j]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)