R语言按年聚合统计满足两项指定条件的COLD事件数量方法
问题分析
你修改后的代码存在两个核心逻辑错误:
which_cold和which_gap是两个分别对应COLD游程、NA游程的布尔向量,两者长度、索引完全不匹配,直接逐元素做&运算逻辑不成立- 没有实现「间隔不足3条NA则合并相邻合格COLD事件」的核心逻辑,仅简单同时判断两个长度,自然无法得到正确结果
修正后的实现代码
rle_col = function(k_col, num = 5, gap_min = 3){ # 替换NA值为字符串方便rle识别 k_col[is.na(k_col)] = "NA" r <- rle(k_col) n_runs <- length(r$values) # 先筛选出所有符合长度要求的COLD游程 valid_cold <- r$values == "COLD" & r$lengths >= num if(sum(valid_cold) == 0) return(0) # 无合格COLD直接返回0 # 拿到所有合格COLD游程的位置索引 valid_idx <- which(valid_cold) event_count <- 1 # 遍历相邻合格COLD,按间隔规则合并事件 for(i in 2:length(valid_idx)){ prev_idx <- valid_idx[i-1] curr_idx <- valid_idx[i] # 提取两个COLD游程之间的所有中间游程 between_idx <- (prev_idx + 1):(curr_idx - 1) if(length(between_idx) == 0){ # 两个COLD直接相邻,合并 next } # 校验中间游程是否全为NA、总长度是否满足最小间隔要求 between_all_na <- all(r$values[between_idx] == "NA") between_length <- sum(r$lengths[between_idx]) # 间隔不满足要求则合并,否则新增事件计数 if(!between_all_na || between_length < gap_min){ next } else { event_count <- event_count + 1 } } return(event_count) }
调用及运行结果
调用逻辑和你原有代码一致:
result <- aggregate(df[2:6], by = list(year = df$year), FUN = rle_col)
输出结果完全匹配你的预期:
year k1 k2 k3 k4 k5 1 1981 0 0 0 1 0
其中k4的计算逻辑符合规则:k4的COLD游程长度分别为5、5、4,仅前两个满足长度要求,两个合格游程之间间隔2个NA(不足3),因此合并为1次事件。
内容的提问来源于stack exchange,提问作者Indrute
相关产品推荐
相关产品推荐

