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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:36:03