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

在R语言中基于leaf_wetness_duration生成符合连续干期条件的新列

按分组识别连续干期并统计符合条件段数的R语言实现方案

需求说明

按Spread_event字段分组,基于leaf_wetness_duration列完成两个任务:

  1. 生成新列,当该组存在**连续12-20行(对应3-5小时,每行代表15分钟)的0值(干期)**时,新列值为TRUE;同时可标记每行是否处于符合条件的干期内。
  2. 统计每组内符合上述条件的连续干期段数量。

问题分析

你之前修改原有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)

代码说明

  1. rle()的使用:该函数会把连续相同值的序列压缩成lengths(段长度)和values(对应值)两个向量,方便批量处理连续段。
  2. 逐行映射:通过rep()把每个连续段的长度和值扩展到每一行,让每行都能知道自己所在的连续段属性。
  3. 多维度标记:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:55:22