R语言数据框分组按日期排序后对多变量连续4行计算统计量方法
R分组分段统计实现方案
你需要在原始分组逻辑的基础上,新增连续4行的子组标识,过滤有效子组后汇总即可,完整代码如下:
# 加载依赖 library(dplyr) library(lubridate) # 示例数据 test = data.frame(my_groups = c("A", "A", "A", "B", "B", "C", "C", "C", "A", "A","A","A","A","A" , "C"), measure1 = c(10:24), measure2 = c(1:15), time= c("20-09-2020", "25-09-2020", "19-09-2020", "20-05-2020", "20-06-2021", "11-01-2021", "13-01-2021", "13-01-2021", "15-01-2021", "15-01-2021", "20-03-2021", "20-10-2021", "29-06-2021", "20-07-2021", "13-06-2021")) # 核心处理逻辑 res <- test %>% # 转换为日期类型,保证时间排序正确 mutate(time = dmy(time)) %>% # 按分组+时间升序排序 arrange(my_groups, time) %>% # 按原始分组字段分组 group_by(my_groups) %>% # 生成子组编号:每连续4行分配同一个编号 mutate(sub_group = ceiling(row_number() / 4)) %>% # 按原始分组+子组进行二次分组 group_by(my_groups, sub_group) %>% # 过滤行数不足4的子组,不需要该规则可直接删除此行 filter(n() == 4) %>% # 汇总计算所需统计量 summarise( measure1 = mean(measure1), measure2 = mean(measure2), time = max(time), .groups = "drop" ) %>% # 移除辅助计算的子组编号列 select(-sub_group) # 查看结果 print(res)
关键逻辑说明
- 必须先将时间字段转换为日期类型,否则字符串格式的时间会按字符顺序排序,不符合实际时间先后逻辑
ceiling(row_number() / 4)可以实现按行号每4行分配同一个子组编号,完全匹配连续4行分段的需求- 若需要保留不足4行的子组,直接删除
filter(n() == 4)即可
内容的提问来源于stack exchange,提问作者DR15
相关产品推荐
相关产品推荐

