data.table来自另一列的列差异集

时间:2016-03-03 23:38:30

标签: r data.table

我正在尝试将另一列中的一组列与data.table区分开来。这是一个简单的例子:

library(data.table)

dt <- data.table(a=1:10,b=11:20,d=21:30)
mycols <- c("b","d")
dt[,c(paste0("diff",mycols)):=lapply(mycols, function(x, env) get(x,env) - get("a",env), env=dt)]
dt
     a  b  d diffb diffd
 1:  1 11 21    10    20
 2:  2 12 22    10    20
 3:  3 13 23    10    20
 4:  4 14 24    10    20
 5:  5 15 25    10    20
 6:  6 16 26    10    20
 7:  7 17 27    10    20
 8:  8 18 28    10    20
 9:  9 19 29    10    20
10: 10 20 30    10    20

我的问题是data.table是否有更好的语法?问题是列“a”没有在函数范围内定义,所以我必须使用get来使其工作。

1 个答案:

答案 0 :(得分:4)

您可以使用.SDmycols进行分组并减去a

dt[, paste0("diff", mycols) := .SD[, mycols, with = FALSE] - a ]
#     a  b  d diffb diffd
# 1:  1 11 21    10    20
# 2:  2 12 22    10    20
# 3:  3 13 23    10    20
# 4:  4 14 24    10    20
# 5:  5 15 25    10    20
# 6:  6 16 26    10    20
# 7:  7 17 27    10    20
# 8:  8 18 28    10    20
# 9:  9 19 29    10    20
#10: 10 20 30    10    20

弗兰克在评论中指出,这也很有效。

dt[, paste0("diff", mycols) := .SD - dt$a, .SDcols=mycols]

不确定什么是更好的做法。