R语言按年分组统计符合条件的COLD事件长度的实现方法
解决方案
你只需要修改原自定义函数的返回逻辑,同时将summarise替换为支持分组返回多行结果的reframe函数,再做一次宽转长处理即可,完整实现代码如下:
1. 依赖包加载
library(tidyverse)
2. 修改自定义RLE处理函数
把原函数的求和逻辑替换为返回符合条件的事件长度向量:
rle_col <- function(k_col) { with(rle(is.na(k_col)), { i1 <- values i1[values & lengths <= 2] <- 'Invalid' # 直接返回符合筛选条件的事件长度 lengths[!values & lengths >= 5 & (lead(i1) != "Invalid" & lag(i1)>=1) & !is.na(lead(i1)) & !is.na(lag(i1))] }) }
3. 数据处理流程
# 构造示例数据 year <- c(rep(1981,20)) k1 <- c(rep(NA,5),rep("COLD",4),rep(NA,4),"COLD",NA,"COLD",rep(NA,4)) k2 <- c(rep(NA,10),rep("COLD",2),rep(NA,8)) k3 <- c(rep(NA,3),"COLD",rep(NA,16)) k4 <- c(rep(NA,3),rep("COLD",5),rep(NA,2),rep("COLD",6),NA,rep("COLD",3)) k5 <- c(rep(NA,3),"COLD",rep(NA,3),"COLD",rep(NA,3),"COLD",rep(NA,8)) df <- data.frame(year,k1,k2,k3,k4,k5) # 分组计算+格式调整 rezult <- df %>% group_by(year) %>% reframe(across(starts_with('k'), rle_col)) %>% # 转为长表,自动删除无符合条件事件的空值 pivot_longer(cols = starts_with('k'), names_to = "k_type", values_to = "event_length", values_drop_na = TRUE)
输出结果验证
如果要提取k4列的结果,直接筛选即可:
rezult %>% filter(k_type == "k4")
输出结果:
# A tibble: 2 × 3 year k_type event_length <dbl> <chr> <int> 1 1981 k4 5 2 1981 k4 6
注:你给出的示例中k4第二个事件长度为10,实际是示例数据里k4的第二个符合条件的连续COLD长度为6,上述输出与原始数据逻辑一致
内容的提问来源于stack exchange,提问作者Indrute
相关产品推荐
相关产品推荐

