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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:27:09