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

使用timetk summarise_by_time时如何保留非时间分组并按季度聚合

问题:timetk summarise_by_time 无法保留非时间分组且数据丢失

我从服务器获取了包含月度产品销量及多类别的数据,希望按产品类别(Main_Category)、区域(Area)和季度进行数据汇总。但使用timetk包的summarise_by_time函数时,无法保留group_by设置的非时间维度分组。查看文档未找到相关说明,当前代码先按date、Area、Main_Category分组汇总销量,此时结果正常;但添加summarise_by_time按季度聚合后,仅保留Area分组,且数据大量丢失(销量总和从约74000降至约800)。

当前代码

plot_dat<-df_m %>%
  group_by(date,Area,Main_Category) %>%
  summarise(sum_products=sum(Products_sold)) %>%
  summarise_by_time(
        .by        = "quarter",
        value      = last(sum_products),
        .type      = "ceiling"
    )

仅执行前两步的结果

`summarise()` has grouped output by 'date', 'Area'. You can override using the `.groups` argument.
# A tibble: 900 × 4
# Groups:   date, Area [240]
   date       Area                       Main_Category          sum_products
   <date>     <chr>                      <chr>                         <int>
 1 2018-11-27 Analysis                   "NGS"                             4
 2 2018-11-27 Analysis                   "PCR"                             0
 3 2018-11-27 Collection/Preservation    ""                                0
 4 2018-11-27 Collection/Preservation    "Preservation Device"           172
 5 2018-11-27 Collection/Preservation    "Preservation Reagent"           10
 6 2018-11-27 Isolation_and_Purification "DNA kits"                       96

添加summarise_by_time后的结果

# A tibble: 84 × 3
# Groups:   date [21]
   date       Area                       value
   <date>     <chr>                      <int>
 1 2019-01-01 Analysis                       0
 2 2019-01-01 Collection/Preservation        9
 3 2019-01-01 Isolation_and_Purification     4
 4 2019-01-01 Lab_Supplies                   2
 5 2019-04-01 Analysis                       0
 6 2019-04-01 Collection/Preservation        0
 7 2019-04-01 Isolation_and_Purification     2
 8 2019-04-01 Lab_Supplies                   1
 9 2019-07-01 Analysis                       0
10 2019-07-01 Collection/Preservation        3

解决方案

问题根源

  1. 分组丢失原因:第一步summarise执行后,分组自动降级为date, Area(输出提示已明确),Main_Category不再是分组变量,导致后续summarise_by_time无法保留该维度。
  2. 数据暴跌原因:使用last(sum_products)仅提取每组最后一条记录的值,而非对季度内所有销量求和,完全不符合聚合需求。

修正代码

直接从原始数据入手,先按非时间维度分组,再执行时间聚合:

plot_dat <- df_m %>%
  # 先按需要保留的非时间维度分组
  group_by(Area, Main_Category) %>%
  summarise_by_time(
    .date_var = date,  # 显式指定时间列(新版本推荐)
    .by = "quarter",
    total_products = sum(Products_sold),  # 对季度销量求和
    .type = "ceiling"
  )

关键修正点

  • 调整分组顺序:先按Area, Main_Category分组,确保这两个维度在时间聚合过程中被保留
  • 替换聚合函数:用sum(Products_sold)替代last(sum_products),实现季度销量汇总
  • 显式指定.date_var:避免timetk对时间列的自动识别歧义(可选,但更稳健)

预期结果

修正后的数据会完整保留Area、Main_Category和季度时间维度,销量总和回归正常水平:

# A tibble: XXX × 4
# Groups:   Area, Main_Category [XX]
  Area                       Main_Category          date       total_products
  <chr>                      <chr>                  <date>              <int>
1 Analysis                   "NGS"                  2019-01-01            150
2 Analysis                   "PCR"                  2019-01-01             80
3 Collection/Preservation    "Preservation Device"  2019-01-01            620

内容的提问来源于stack exchange,提问作者user20453870

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:38:11