使用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
解决方案
问题根源
- 分组丢失原因:第一步
summarise执行后,分组自动降级为date, Area(输出提示已明确),Main_Category不再是分组变量,导致后续summarise_by_time无法保留该维度。 - 数据暴跌原因:使用
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
相关产品推荐
相关产品推荐

