我想在by-without-by操作中保留by变量data.table.
我有一个过去曾经工作过(大约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 ) ]
Run Code Online (Sandbox Code Playgroud)
哪个产生:
> 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
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
> 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
Run Code Online (Sandbox Code Playgroud)
这确实有效,但不够优雅,可能效率低下.
是否有一个我缺失的论点或一个聪明的策略来保留变量?
添加by = .EACHI以获取"by-without-by"aka-EACH-element-of I:
dt[allPermutationsOfByvars, x, by = .EACHI]
Run Code Online (Sandbox Code Playgroud)
这就是我做初始部分的方式:
allPermutationsOfByvars = dt[, do.call(CJ, unique(setDT(mget(by))))]
Run Code Online (Sandbox Code Playgroud)
最后,on争论通常是现在更好的选择(vs setkey).