通过同一列汇总一列

时间:2019-01-16 19:49:24

标签: r data.table

如果我们在data.tabledt[, 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

1 个答案:

答案 0 :(得分:2)

by=中的每一列都减少为一,而不是将值重复复制到组.N的长度中,从而占用了更多的内存。不过,您仍然可以通过乘以.N来计算总和:

dt[, x*.N, by=x]

...或可以将全长向量添加到.SD中(尽管这永远是没有必要的):

dt[, sum(.SD$x), by=x, .SDcols="x"]

.SD是给定by=组的“数据子集”。有关详细信息,请参见?.SD?.N