data.table中cube与rollup函数的差异及结果缺失问题咨询
data.table中cube与rollup函数的差异解析
核心差异
- cube:会生成
by参数里所有字段的全部可能分组组合,包括单个字段独立分组、多个字段任意组合分组,以及无字段的全量汇总,相当于把所有能想到的分组方式都跑一遍。 - rollup:只生成层级递进的分组组合,严格遵循
by参数的字段顺序——从全部字段联合分组开始,每次去掉最后一个字段继续分组,直到无字段的全量汇总,不会出现跳过前面字段只保留后面字段的分组情况。
结合代码实例的具体解释
你的by参数是c('country','category'),两种函数的分组逻辑直接导致结果差异:
- 用
cube生成的result_1包含4种分组结果:- 按
country+category联合分组 - 仅按
country分组 - 仅按
category分组(也就是你提到的grouping 2) - 无分组的全量汇总
- 按
- 用
rollup生成的result_2只包含3种分组结果:- 按
country+category联合分组 - 仅按
country分组 - 无分组的全量汇总
所以result_2自然缺失了仅按category分组的那部分数据(grouping 2)。
- 按
代码示例
library(tidyverse) library(data.table) country <- c('UK','US','UK','US') category <- c("A", "B", "A", "B") y2021 <- c(17, 42, 21, 12) y2022 <- c(49, 23, 52, 90) raw_data <- data.frame(country,category,y2021,y2022) %>% as.data.table() # cube生成全量分组组合 result_1<-cube(raw_data,j=lapply(.SD,sum), by=c('country','category'), id =TRUE, .SDcols=c('y2021','y2022')) # rollup生成层级分组组合 result_2<-rollup(raw_data,j=lapply(.SD,sum), by=c('country','category'), id =TRUE, .SDcols=c('y2021','y2022'))
(注:你提到的附图显示result_1包含仅category分组的汇总行,而result_2无此内容,正好对应上述逻辑差异)
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

