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

R语言数据处理:如何删除连续日期结束后的行?

保留每个人初始连续日期段的解决方案

针对你需要移除每个人连续日期结束后所有行的需求,这里提供两种高效实现方式,无需复杂的for循环:

使用dplyr(tidyverse风格)

library(dplyr)

df <- data.frame(person = c('A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'),
                 day = c(1, 2, 4, 6, 7, 10, 11, 12))

result <- df %>%
  group_by(person) %>%
  # 计算相邻日期差值,首行默认连续(差值设为1)
  mutate(diff_day = c(1, diff(day))) %>%
  # 标记连续段:日期断开时开启新段,初始段编号为0
  mutate(segment = cumsum(diff_day != 1)) %>%
  # 仅保留初始连续段
  filter(segment == 0) %>%
  # 清理辅助列
  select(-diff_day, -segment) %>%
  ungroup()

print(result)

运行输出:

# A tibble: 4 × 2
  person   day
  <chr>  <dbl>
1 A          1
2 A          2
3 B          6
4 B          7

关键步骤解释:

  • group_by(person):按个体分组处理,确保每个用户的日期逻辑独立计算
  • diff(day):计算当前日期与前一日的差值,首行无前置日期,手动设为1(默认属于连续段)
  • cumsum(diff_day != 1):当差值≠1时,说明日期断开,累加计数生成不同的连续段编号,初始连续段编号始终为0
  • filter(segment == 0):筛选出每个用户的第一个连续日期段

使用Base R(无第三方依赖)

如果不想加载dplyr,用base R的ave函数也能实现:

df <- data.frame(person = c('A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'),
                 day = c(1, 2, 4, 6, 7, 10, 11, 12))

# 按分组计算日期差值
df$diff_day <- ave(df$day, df$person, FUN = function(x) c(1, diff(x)))
# 按分组标记连续段
df$segment <- ave(df$diff_day, df$person, FUN = function(x) cumsum(x != 1))
# 筛选初始连续段并清理列
result_base <- df[df$segment == 0, c("person", "day")]

print(result_base)

输出结果和dplyr版本一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:26:12