如何在dplyr中按年份分组计算new.high最长连续0序列长度
按分组计算连续0的最大长度
针对已按yeard和ydayd排序的so.df数据框,要按yeard分组计算new.high列中连续0的最大长度,以下是两种常用实现方式:
方法1:使用dplyr包
library(dplyr) so.df %>% group_by(yeard) %>% # 为组内连续相同的new.high值分配唯一标识 mutate(zero_group = cumsum(new.high != lag(new.high, default = first(new.high)))) %>% filter(new.high == 0) %>% # 统计每组内各连续0序列的长度 group_by(yeard, zero_group) %>% summarise(zero_length = n(), .groups = "drop_last") %>% # 提取每组的最大连续0长度 summarise(max_zero_length = max(zero_length, na.rm = TRUE))
方法2:使用data.table包(大数据场景更高效)
library(data.table) setDT(so.df) so.df[, .( max_zero_length = { rle_obj <- rle(new.high) # 提取连续0的长度,无0时返回0 max(rle_obj$lengths[rle_obj$values == 0], 0, na.rm = TRUE) }), by = yeard]
说明
- 两种方法均实现分组计算逻辑,和你原本的全局
rle操作逻辑一致,只是限定在yeard分组内执行 - 若某分组中没有0值,
max参数na.rm=TRUE和兜底值0会确保返回0而非NA
内容的提问来源于stack exchange,提问作者ECII
相关产品推荐
相关产品推荐

