如何单步按district分组:求和incoming并取末季度stock值?
高效实现分组聚合:求和营收字段+提取季度末库存字段
需求说明
按district字段分组:
- 对
incoming字段跨季度求和 - 获取最后一个季度(第3季度)的
stock类字段值(共8个此类字段,不可跨季度求和)
实际数据集规模:约45000行、41个变量
示例数据
library(dplyr) df <- data.frame( "district" = rep(c("ARA", "BJI", "CMC"), each=3), "quarter" = rep(1:3, 3), "incoming" = c(4044, 2992, 2556, 1639, 9547, 1191, 2038, 1942, 225), "stock" = c(19547, 3160, 1533, 5355, 6146, 355, 5816, 1119, 333) ) df
期望结果
# A tibble: 3 × 3 district stock incoming <chr> <dbl> <dbl> 1 ARA 1533 9592 2 BJI 355 12377 3 CMC 333 4205
现有实现方案
通过三步拆分处理后合并结果:
basea <- df %>% group_by(district) %>% filter(quarter == 3) %>% # 仅保留最后一季度数据 summarise(across(stock, sum)) baseb <- df %>% group_by(district) %>% summarise(across(incoming, sum)) final <- full_join(basea, baseb)
优化实现方案(一步完成)
利用dplyr的summarise同时完成两种聚合逻辑,无需拆分合并,效率更高:
library(dplyr) final <- df %>% group_by(district) %>% summarise( # 对incoming字段跨季度求和 incoming = sum(incoming), # 批量提取所有stock类字段的第3季度值(可根据实际字段名调整匹配规则) across(starts_with("stock"), ~ .x[quarter == 3]) )
补充说明
- 如果stock类字段的命名规则不是以
stock开头,可替换starts_with("stock")为其他匹配方式(比如ends_with("_stock")或直接指定字段向量c("stock1", "stock2", ...)) - 若每个
district的quarter=3存在重复行,可添加first()确保取值唯一:~ first(.x[quarter == 3])
内容的提问来源于stack exchange,提问作者Modus
相关产品推荐
相关产品推荐

