You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

data.table中cube与rollup函数的差异及结果缺失问题咨询

data.table中cube与rollup函数的差异解析

核心差异

  • cube:会生成by参数里所有字段的全部可能分组组合,包括单个字段独立分组、多个字段任意组合分组,以及无字段的全量汇总,相当于把所有能想到的分组方式都跑一遍。
  • rollup:只生成层级递进的分组组合,严格遵循by参数的字段顺序——从全部字段联合分组开始,每次去掉最后一个字段继续分组,直到无字段的全量汇总,不会出现跳过前面字段只保留后面字段的分组情况。

结合代码实例的具体解释

你的by参数是c('country','category'),两种函数的分组逻辑直接导致结果差异:

  • 用cube生成的result_1包含4种分组结果:
    1. 按country+category联合分组
    2. 仅按country分组
    3. 仅按category分组(也就是你提到的grouping 2)
    4. 无分组的全量汇总
  • 用rollup生成的result_2只包含3种分组结果:
    1. 按country+category联合分组
    2. 仅按country分组
    3. 无分组的全量汇总
      所以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:40:04