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

在R语言中按分组(id)以首个日期为基准计算日期列差值

解决R语言分组按首个可用日期计算时间差的问题

核心思路是按id分组后,提取每组内第一个非缺失的date_1作为统一基准,而非用lag()(它仅取前一行值,无法实现全局组基准)。

示例代码与步骤

首先加载dplyr包(处理分组操作),并构造示例数据集:

library(dplyr)

# 模拟你的数据集(包含缺失值)
df <- tibble(
  id = c(1,1,1,2,2),
  date_1 = as.Date(c("2023-01-01", NA, "2023-01-02", "2023-02-10", NA)),
  date_2 = as.Date(c("2023-01-03", "2023-01-05", "2023-01-06", "2023-02-12", "2023-02-15"))
)

执行分组计算:

df_result <- df %>%
  group_by(id) %>%
  mutate(
    # 提取组内第一个非NA的date_1作为基准日期
    base_date = first(date_1, na.rm = TRUE),
    # 计算date_2与基准的时间差(默认单位为天)
    date_diff = date_2 - base_date
  ) %>%
  ungroup()

输出结果

# A tibble: 5 × 5
     id date_1     date_2     base_date  date_diff
  <dbl> <date>     <date>     <date>     <drtn>   
1     1 2023-01-01 2023-01-03 2023-01-01 2 days   
2     1 NA         2023-01-05 2023-01-01 4 days   
3     1 2023-01-02 2023-01-06 2023-01-01 5 days   
4     2 2023-02-10 2023-02-12 2023-02-10 2 days   
5     2 NA         2023-02-15 2023-02-10 5 days   

关键说明

  • 为什么lag()不行?lag()是取当前行的前一行值,无法固定为组内第一个可用日期,当组内存在缺失值或多行时,会导致基准值混乱。
  • 如果date_1是字符格式,先通过as.Date(date_1)转换为日期类型。
  • 如需其他时间单位(周、月),可结合lubridate包:
    library(lubridate)
    
    df_result <- df %>%
      group_by(id) %>%
      mutate(
        base_date = first(date_1, na.rm = TRUE),
        date_diff_weeks = as.duration(date_2 - base_date) / dweeks(1),
        date_diff_months = interval(base_date, date_2) %/% months(1)
      ) %>%
      ungroup()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:01:36