如果我们在data.table
和dt[, sum(x), by = "y"]
中引用相同的列,即{{1},为什么j
by
中用于列聚合的常规语法不起作用}}?
dt[, sum(x), by = "x"]
我想用library(data.table)
set.seed(1)
dt <- data.table(x = sample(c(1:10), 20, T), y = sample(letters[1:4], 20, T))
setorderv(dt, "y")
对x
求和,但以下操作无效,它仅复制了x
列:
x
现在,如果我愿意:
> dt[, sum(x, na.rm = T), by = "x"]
x V1
1: 4 4
2: 10 10
3: 3 3
4: 9 9
5: 7 7
6: 1 1
7: 8 8
8: 6 6
9: 2 2
10: 5 5
那行得通。
另一方面,如果> dt[, .(res = lapply(.SD, sum, na.rm = T)), by = 'x', .SDcols = "x"]
x res
1: 4 12
2: 10 30
3: 3 9
4: 9 9
5: 7 21
6: 1 1
7: 8 24
8: 6 6
9: 2 2
10: 5 5
参数的列与by
中用于聚合的列不同,则以下聚合有效(按预期):
j
答案 0 :(得分:2)
by=
中的每一列都减少为一,而不是将值重复复制到组.N
的长度中,从而占用了更多的内存。不过,您仍然可以通过乘以.N
来计算总和:
dt[, x*.N, by=x]
...或可以将全长向量添加到.SD
中(尽管这永远是没有必要的):
dt[, sum(.SD$x), by=x, .SDcols="x"]
.SD
是给定by=
组的“数据子集”。有关详细信息,请参见?.SD
或?.N
。