在R语言中查找连续序列的首个和末次日期
在R中查找数据框连续序列的首尾日期解决方案
嘿,我来帮你搞定这个问题!首先咱们先把你的数据补全,构建成完整的数据框(我给value后面补了些示例值,不影响核心逻辑):
# 构建完整数据框 date <- as.Date(c("1993-09-21", "1994-02-12", "1994-02-23", "1994-05-14", "1994-08-18", "1994-08-25", "1994-08-29", "1994-09-17", "1994-10-16", "1994-10-16", "1994-10-22", "1994-10-26", "1994-12-26", "1995-04-12", "1995-05-04", "1995-06-20", "1995-07-11", "1995-07-27", "1995-08-14", "1995-08-15", "1995-08-22", "1995-08-27", "1995-08-27", "1995-08-28", "1995-08-30", "1995-08-30", "1995-09-03", "1995-09-03", "1995-09-03", "1995-09-15")) value <- c(2, 1, 1, 1, 2, 1, 2, 4, 3, 1, 5, 2, 3, 1, 4, 2, 5, 1, 3, 2, 4, 1, 2, 3, 1, 2, 4, 1, 3, 2) df <- data.frame(date, value)
接下来分两种常见场景来处理,你可以根据自己的需求选择:
场景1:按日期连续分组(日期差≤1天算连续,含同一天多条记录)
核心思路是给每个连续的日期块分配一个分组ID,再按分组统计首尾日期。
基础R实现
不用额外装包,用基础函数就能搞定:
# 计算当前日期与前一天的差值,差值>1说明是新分组的开始 df$group <- cumsum(c(1, diff(df$date)) > 1) # 按分组汇总首尾日期 result <- aggregate(date ~ group, df, function(x) c(first_date = min(x), last_date = max(x))) # 把嵌套的结果展开成标准数据框 result <- do.call(data.frame, result) print(result)
dplyr实现(更简洁直观)
如果你常用tidyverse工具链,用dplyr写起来更顺手:
library(dplyr) result <- df %>% # 生成分组ID:当当前日期和前一天日期差>1时,分组+1 mutate(group = cumsum(date - lag(date, default = first(date)) > 1)) %>% # 按分组统计首尾日期 group_by(group) %>% summarize( first_date = min(date), last_date = max(date), .groups = "drop" # 取消分组状态 ) print(result)
场景2:按value连续相同分组(同一个value连续出现算一个序列)
如果你的“连续序列”是指value相同的连续组,只需要调整分组的判断逻辑就行:
library(dplyr) result <- df %>% # 当当前value和前一个不同时,分组+1 mutate(group = cumsum(value != lag(value, default = first(value)))) %>% group_by(group) %>% summarize( group_value = first(value), # 记录该组的value first_date = min(date), last_date = max(date), .groups = "drop" ) print(result)
这样就能轻松得到每个连续序列的首尾日期啦~
内容的提问来源于stack exchange,提问作者luciano
相关产品推荐
相关产品推荐

