2016-03-03 42 views
2

我試圖通過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來使其工作。

+0

你的問題解釋瞭如何在data.table中使用環境的概念。這進一步幫助我理解data.table。謝謝。 –

回答

4

可以使用mycols子集.SD和減去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] 

不知道什麼是更好的做法,雖然。

+0

這更乾淨。謝謝! –