R data.table快速方法跨类别汇总时追加列总数?

时间:2018-07-19 11:12:11

标签: r data.table

我经常发现自己在数据表聚合的底部添加了一个“总计”行。通常,总数只是各列之和。

这是我要执行的操作的简化示例:

DT = data.table(t = rep(as.Date(c("2018-05-01", "2018-07-01"))), 
                x=rep(c("b","a","c", "d"),each=5), y=rep(c(1,3,6, 5, 5), 4), v=1:20)

DT.agg <- DT[, .(y = sum(y), v = sum(v)), by = .(t, x)]
DT.agg

DT.agg
# t x  y  v
# 1: 2018-05-01 b 12  9
# 2: 2018-07-01 b  8  6
# 3: 2018-07-01 a 12 24
# 4: 2018-05-01 a  8 16
# 5: 2018-05-01 c 12 39
# 6: 2018-07-01 c  8 26
# 7: 2018-07-01 d 12 54
# 8: 2018-05-01 d  8 36

现在问题来了。有没有一种快速有效的方法来在此聚合中添加“总计”?当以交互方式运行R并快速探索数据的多个聚合时,我通常会这样做(但是很烦人,这需要花几行代码):

DT.tot <- DT[, .(x = "total", y = sum(y), v = sum(v)), by = t]
DT.agg2 <- rbind(DT.agg, DT.tot)

DT.agg2
# t     x  y   v
# 1: 2018-05-01     b 12   9
# 2: 2018-07-01     b  8   6
# 3: 2018-07-01     a 12  24
# 4: 2018-05-01     a  8  16
# 5: 2018-05-01     c 12  39
# 6: 2018-07-01     c  8  26
# 7: 2018-07-01     d 12  54
# 8: 2018-05-01     d  8  36
# 9: 2018-05-01 total 40 100
# 10: 2018-07-01 total 40 110

是否有一种快速或更聪明的方法来获得DT.agg2而没有明确建立我可能会忽略的总数和绑定?

我想要总数,因为最终我想计算这样的东西,y在类别“ a”中的百分比,等等:

DT.c <- dcast(DT.agg2, t ~ x, value.var = c("y", "v"))
# 
DT.c[, pct_y_a := y_a / y_total]

DT.c
#            t y_a y_b y_c y_d y_total v_a v_b v_c v_d v_total pct_y_a
#1: 2018-05-01   8  12  12   8      40  16   9  39  36     100     0.2
#2: 2018-07-01  12   8   8  12      40  24   6  26  54     110     0.3

1 个答案:

答案 0 :(得分:4)

rollup计算各个分组级别的汇总,得出多个总计(/小计):

library(data.table)  # I'm using version 1.11.4
rollup(DT, j = lapply(.SD, sum), by = c("t", "x"))
#             t      x     y     v
#        <Date> <char> <num> <int>
# 1: 2018-05-01      b    12     9
# 2: 2018-07-01      b     8     6
# 3: 2018-07-01      a    12    24
# 4: 2018-05-01      a     8    16
# 5: 2018-05-01      c    12    39
# 6: 2018-07-01      c     8    26
# 7: 2018-07-01      d    12    54
# 8: 2018-05-01      d     8    36
# 9: 2018-05-01   <NA>    40   100    # <- total for date 2018-05-01
#10: 2018-07-01   <NA>    40   110    # <- total for date 2018-07-01
#11:       <NA>   <NA>    80   210    # <- grand total

rollup的帮助文件说明:

  

计算产生多个(小)总计的不同分组级别的聚集。反映SQL的GROUPING SETS操作。