如何从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
相关产品推荐
相关产品推荐

