如何基于大型DataFrame按日期、类别及类型聚合生成汇总DataFrame?
处理大规模DataFrame的多维度日期汇总需求
嘿,我懂你需要基于那份不能修改的超大DataFrame,按日期统计三个层级的quantity总和:每日总quantity、各category的每日总quantity,还有每个category+type组合的每日总quantity。下面给你两种在R里的实现方案,全程不会改动原数据,放心用:
方案一:用dplyr实现(语法直观易读)
先确保你装了dplyr包(处理大数据也很高效):
install.packages("dplyr") library(dplyr)
我们分三步生成不同层级的汇总,再合并到一起:
- 计算每日总quantity
daily_total <- df %>% group_by(date) %>% summarise( category = "Total", type = "Total", total_quantity = sum(quantity) )
- 计算每个category的每日总quantity
category_daily <- df %>% group_by(date, category) %>% summarise( type = "Total", total_quantity = sum(quantity) )
- 计算每个category+type组合的每日总quantity
category_type_daily <- df %>% group_by(date, category, type) %>% summarise( total_quantity = sum(quantity) )
最后把三个结果合并成完整的汇总表,还可以按日期、category、type排序,看起来更清晰:
summary_df <- bind_rows(daily_total, category_daily, category_type_daily) %>% arrange(date, category, type)
方案二:用data.table实现(超大规模数据首选)
如果你的数据量真的大到百万级甚至更多,data.table的速度优势会非常明显。先安装加载:
install.packages("data.table") library(data.table)
把原DataFrame转成data.table(只是生成副本,完全不碰原数据):
dt <- as.data.table(df)
同样分三步生成汇总:
# 每日总quantity daily_total_dt <- dt[, .(category = "Total", type = "Total", total_quantity = sum(quantity)), by = date] # 各category的每日总quantity category_daily_dt <- dt[, .(type = "Total", total_quantity = sum(quantity)), by = .(date, category)] # 各category+type组合的每日总quantity category_type_daily_dt <- dt[, .(total_quantity = sum(quantity)), by = .(date, category, type)] # 合并并排序结果 summary_dt <- rbind(daily_total_dt, category_daily_dt, category_type_daily_dt)[order(date, category, type)]
验证你的示例数据
用你给的2021-01-09的测试数据跑的话,结果完全符合你的要求:
- 当日总quantity是0.117
- UKS的总量是0.001+0.018+0.010+0.023=0.052
- USD的总量是0.003+0.043+0.005+0.005=0.056
- UKZ和UKY的总量分别是0.001和0.008
整个过程都是基于原数据生成新的汇总表,绝对不会修改你原有的大DataFrame。
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

