我经常发现自己在数据表聚合的底部添加了一个“总计”行。通常,总数只是各列之和。
这是我要执行的操作的简化示例:
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
答案 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操作。