如何在R中基于日期列按ID拆分数据框为多行
解决R数据框按test_date拆分行并新增exposure列的需求
直接上可运行的代码,用你已经加载的dplyr、lubridate工具就能实现:
library(dplyr) library(lubridate) library(tidyr) # 拆分test_date非空的行 split_rows <- data %>% filter(!is.na(test_date)) %>% rowwise() %>% summarise( ID = ID, start_date = c(start_date, test_date), end_date = c(test_date - days(1), end_date), test_date = rep(test_date, 2), exposure = c(0, 1), .groups = "drop" ) # 处理test_date为空的行 na_rows <- data %>% filter(is.na(test_date)) %>% mutate(exposure = 0) # 合并所有行并按ID排序 result <- bind_rows(split_rows, na_rows) %>% arrange(ID) # 查看结果示例 head(result)
代码逻辑说明
非空test_date行处理:
先筛出有测试日期的行,逐行生成两行数据:- 第一行沿用原始起始日期,结束日期设为测试日期的前一天,
exposure标记为0 - 第二行起始日期改为测试日期,结束日期保留原始值,
exposure标记为1
- 第一行沿用原始起始日期,结束日期设为测试日期的前一天,
空test_date行处理:
直接给这类行新增exposure列并赋值0,所有原始列保持不变合并排序:
把两类结果合并后按ID排序,保证和原始数据的ID顺序一致
内容的提问来源于stack exchange,提问作者Pontus Hedberg
相关产品推荐
相关产品推荐

