R语言按日期向dataframe插入行 实现每个id对应1-90天共90行
R语言实现按规则补全日期与score的方案
用到tidyverse生态的dplyr、tidyr、lubridate包可快速实现需求,步骤如下:
第一步:加载依赖包与导入示例数据
library(dplyr) library(tidyr) library(lubridate) # 导入示例数据,统一转换日期格式为Date类型 df <- tibble( id = c(1,1,1,1,1,2,2,2,2,2), date = dmy(c("01-01-2001","02-01-2001","31-01-2001","01-02-2001","02-02-2001", "01-04-2001","03-04-2001","05-05-2001","06-05-2001","07-05-2001")), death = dmy(c(rep("04-02-2001",5), rep(NA_character_,5))), score = c(14,16,15,16,12,5,6,9,2,10) )
第二步:生成每个id的90天完整日期序列
df_full <- df %>% group_by(id) %>% # 取每个id最早的score日期作为第1天 mutate(first_date = min(date)) %>% # 生成从第1天开始往后90天的连续日期,补齐缺失的行 complete(date = seq(first_date, first_date + days(89), by = "1 day")) %>% # 填充每个id固定的death、first_date字段 fill(death, first_date, .direction = "downup") %>% ungroup()
第三步:按规则给score赋值
df_result <- df_full %>% mutate( # 死亡日期为NA的默认设为第90天之后,避免判断错误 death_date = if_else(is.na(death), max(date)+days(1), death), score = case_when( # 已有score的保留原值 !is.na(score) ~ score, # 日期在死亡日期之后的赋值为20 date > death_date ~ 20, # 其余无score记录的死亡前日期赋值为0 TRUE ~ 0 ) ) %>% # 清理辅助列,按id和日期排序得到最终结果 select(id, date, death, score) %>% arrange(id, date)
结果验证
运行以下代码可确认每个id恰好有90行记录:
df_result %>% count(id)
内容的提问来源于stack exchange,提问作者vincentleroy
相关产品推荐
相关产品推荐

