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

时间:2016-04-12 21:01:18

标签: r data.table

我想使用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

确实有效,但不够优雅且可能效率低下。

是否存在我缺少的论据或保留变量的聪明策略?

1 个答案:

答案 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)。