保留R data.table中的变量by-without-by

Ari*_*man 3 r data.table

我想在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)

这确实有效,但不够优雅,可能效率低下.

是否有一个我缺失的论点或一个聪明的策略来保留变量?

edd*_*ddi 6

添加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).