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

基于分组内其他日期填充缺失的date_end值

分组内日期NA值填充解决方案

针对你的需求,我们可以用dplyr结合lubridate包实现规则填充,步骤如下:

1. 安装并加载所需包

如果是首次使用,先安装依赖包:

install.packages(c("dplyr", "lubridate"))

加载包:

library(dplyr)
library(lubridate)

2. 数据处理代码

# 原始数据
id <- c("A1", "A1", "A1", "A1", "B2","B2","C1", "C2")
date_start <- as.Date(c("2022-01-01", "2022-01-06", "2022-01-10", "2022-05-23","2023-01-02", "2022-07-19","2022-12-07", "2023-03-23"))
date_end <- as.Date(c("2022-01-05", NA, "2022-04-13", NA, NA, "2023-10-06", "2023-01-18", "2023-08-15"))

df <- data.frame(id, date_start, date_end)

# 按规则填充NA
df_filled <- df %>%
  group_by(id) %>%
  arrange(date_start, .by_group = TRUE) %>% # 组内按开始日期排序,确保后续取到正确的下一行日期
  mutate(
    date_end = case_when(
      !is.na(date_end) ~ date_end,          # 保留已有非NA值
      !is.na(lead(date_start)) ~ lead(date_start) - days(1), # 用下一行开始日期减1天填充
      TRUE ~ date_start + years(1)          # 组内最后一行,用开始日期加1年填充
    )
  ) %>%
  ungroup()

# 查看填充后的数据
print(df_filled)

3. 关键逻辑说明

  • group_by(id):按个体ID分组,保证每个组内独立处理日期序列
  • arrange(date_start, .by_group = TRUE):组内按date_start升序排序,解决原始数据中部分组(如B2)日期顺序混乱的问题,确保lead()能取到正确的下一行开始日期
  • case_when多条件判断:
    • 优先保留已有的date_end非NA值
    • 若当前date_end为NA且组内有下一行date_start,则用该日期减1天填充
    • 若为组内最后一行(无后续date_start),则用当前行date_start加1年填充(lubridate::years(1)自动处理闰年,比固定加365天更准确)

4. 填充后结果

# A tibble: 8 × 3
  id    date_start date_end  
  <chr> <date>     <date>    
1 A1    2022-01-01 2022-01-05
2 A1    2022-01-06 2022-01-09
3 A1    2022-01-10 2022-04-13
4 A1    2022-05-23 2023-05-23
5 B2    2022-07-19 2023-01-01
6 B2    2023-01-02 2023-10-06
7 C1    2022-12-07 2023-01-18
8 C2    2023-03-23 2024-03-23

内容的提问来源于stack exchange,提问作者a nony mouse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:15:25