我想使用data.table
在by-without-by操作中保留by变量。
我有一个过去曾经工作过(大约2年前),现在使用最新版本的data.table
我认为行为必须改变。
这是一个可重复的例子:
library(data.table)
dt <- data.table( by1 = letters[1:3], by2 = LETTERS[1:3], x = runif(3) )
by <- c("by1","by2")
allPermutationsOfByvars <- do.call(CJ, sapply(dt[,by,with=FALSE], unique, simplify=FALSE)) ## CJ() to form index
setkeyv(dt, by)
dt[ allPermutationsOfByvars, list( x = x ) ]
产生:
> dt[ allPermutationsOfByvars, list( x = x ) ]
x
1: 0.9880997
2: NA
3: NA
4: NA
5: 0.4650647
6: NA
7: NA
8: NA
9: 0.4899873
我可以这样做:
> cbind( allPermutationsOfByvars, dt[ allPermutationsOfByvars, list( x = x ) ] )
by1 by2 x
1: a A 0.9880997
2: a B NA
3: a C NA
4: b A NA
5: b B 0.4650647
6: b C NA
7: c A NA
8: c B NA
9: c C 0.4899873
确实有效,但不够优雅且可能效率低下。
是否存在我缺少的论据或保留变量的聪明策略?
答案 0 :(得分:6)
添加by = .EACHI
以获取“by-without-by”又名为-EACH-element-of-I:
dt[allPermutationsOfByvars, x, by = .EACHI]
这就是我完成初始部分的方式:
allPermutationsOfByvars = dt[, do.call(CJ, unique(setDT(mget(by))))]
最后,on
参数现在通常是更好的选择(vs setkey
)。