You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:09:01