在R语言中基于leaf_wetness_duration生成符合连续干期条件的新列
按分组识别连续干期并统计符合条件段数的R语言实现方案
需求说明
按Spread_event字段分组,基于leaf_wetness_duration列完成两个任务:
- 生成新列,当该组存在**连续12-20行(对应3-5小时,每行代表15分钟)的0值(干期)**时,新列值为TRUE;同时可标记每行是否处于符合条件的干期内。
- 统计每组内符合上述条件的连续干期段数量。
问题分析
你之前修改原有rle代码时出现报错,大概率是因为原逻辑仅判断最长0值段是否满足单一阈值,改为区间判断后,max()返回的单一值无法适配>=12 & <=20的区间条件,且原代码无法实现逐行标记和段数统计。
完整解决方案
以下是基于dplyr和rle()的实现代码,包含示例数据验证:
library(dplyr) # 构建示例数据 df <- tibble( Spread_event = rep(1, 15), date = c("8/19/15 7:15 PM", "8/19/15 7:30 PM", "8/19/15 7:45 PM", "8/19/15 8:00 PM", "8/19/15 8:15 PM", "8/19/15 8:30 PM", "8/19/15 8:45 PM", "8/19/15 9:00 PM", "8/19/15 9:15 PM", "8/19/15 9:30 PM", "8/19/15 9:45 PM", "8/19/15 10:00 PM", "8/19/15 10:15 PM", "8/19/15 10:30 PM", "8/19/15 10:45 PM"), leaf_wetness_duration = c(15, 2, rep(0, 11), 3) ) # 核心处理逻辑 result <- df %>% group_by(Spread_event) %>% mutate( # 生成每组的rle对象,存储连续段的长度和值 rle_obj = list(rle(leaf_wetness_duration)), # 将连续段的长度映射到每一行 run_length = rep(rle_obj[[1]]$lengths, rle_obj[[1]]$lengths), # 将连续段的对应值映射到每一行 run_value = rep(rle_obj[[1]]$values, rle_obj[[1]]$lengths), # 标记当前行是否处于符合条件的干期段 in_valid_dry_period = run_value == 0 & run_length >= 12 & run_length <= 20, # 标记该组是否存在符合条件的干期 has_valid_dry_period = any(in_valid_dry_period), # 统计该组内符合条件的连续干期段数量 valid_dry_segment_count = sum(rle_obj[[1]]$values == 0 & rle_obj[[1]]$lengths >= 12 & rle_obj[[1]]$lengths <= 20) ) %>% # 移除中间临时变量列 select(-rle_obj, -run_length, -run_value) %>% ungroup() # 输出结果 print(result)
代码说明
rle()的使用:该函数会把连续相同值的序列压缩成lengths(段长度)和values(对应值)两个向量,方便批量处理连续段。- 逐行映射:通过
rep()把每个连续段的长度和值扩展到每一行,让每行都能知道自己所在的连续段属性。 - 多维度标记:
in_valid_dry_period:标记单一行是否处于符合条件的干期内;has_valid_dry_period:标记整个分组是否存在符合条件的干期;valid_dry_segment_count:统计分组内符合条件的连续干期段总数。
结果验证
针对示例数据,其中连续0值的行数为11,不满足12-20的条件,因此has_valid_dry_period为FALSE,valid_dry_segment_count为0;如果把连续0值的行数改为12,这两个字段会分别变为TRUE和1。
内容的提问来源于stack exchange,提问作者Ahsk
相关产品推荐
相关产品推荐

