基于分组内其他日期填充缺失的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
相关产品推荐
相关产品推荐

