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

如何从R数据集识别提取连续3天及以上高温天的序列信息?

识别连续3天及以上的高温天序列并生成统计数据集

问题背景

现有包含日期和高温标记(1=高温天,0=非高温天)的数据集,需要提取连续3天及以上的高温天序列,输出包含序列起始日期、结束日期和时长的结果集。

示例数据集

hotday <- c(0,1,0,1,1,1,0,0,1,1,1,1,0)
dates <- seq.Date(from=as.Date("1990-06-01"), by="day",length.out = length(hotday))
df <- data.frame(dates,hotday)

期望输出

startdate    enddate length
1 1990-06-04 1990-06-06      3
2 1990-06-09 1990-06-12      4

解决方案

方法1:Base R 实现

通过标记连续分组、筛选高温组、聚合统计三个步骤完成:

# 为连续相同标记的行分配分组ID
df$group <- cumsum(c(1, diff(df$hotday) != 0))

# 筛选出所有高温天记录
hot_groups <- subset(df, hotday == 1)

# 按分组统计起止日期和序列长度
result <- aggregate(dates ~ group, hot_groups, function(x) {
  data.frame(startdate = min(x), enddate = max(x), length = length(x))
})

# 展开聚合结果并筛选长度≥3的序列
result <- do.call(rbind, result$dates)
result <- subset(result, length >= 3)

# 重置行名
rownames(result) <- NULL

# 查看结果
result

方法2:Tidyverse 实现(dplyr + tidyr)

如果熟悉tidyverse语法,代码更简洁易读:

# 安装并加载tidyverse包(首次运行需安装)
# install.packages("tidyverse")
library(tidyverse)

result <- df %>%
  # 标记连续相同值的分组
  mutate(group = cumsum(hotday != lag(hotday, default = hotday[1]))) %>%
  # 仅保留高温天记录
  filter(hotday == 1) %>%
  # 按分组聚合统计
  group_by(group) %>%
  summarise(
    startdate = min(dates),
    enddate = max(dates),
    length = n()
  ) %>%
  # 筛选长度≥3的序列
  filter(length >= 3) %>%
  # 取消分组并移除无用的group列
  ungroup() %>%
  select(-group)

# 查看结果
result

内容的提问来源于stack exchange,提问作者Torben Callesen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:20:28