R如何基于日期规则将单个时间周期行拆分为多条数据行
R 实现日期周期拆分方案
依赖包
需要提前安装加载tidyverse系列工具包处理数据与日期:
library(tidyverse) library(lubridate)
实现逻辑
- 先统一将原始数据的起止字段转换为日期格式,提取起始日期的月日作为每年锚点
- 逐行生成所有时间锚点:初始起始日、每年12月31日、每年和起始日同月日的日期
- 过滤掉超出原结束日期的锚点后,将相邻锚点配对为拆分后的周期
- 计算每个周期的天数,自动重复原ID等基础字段信息
可运行代码
# 1. 预处理原始数据,转换日期格式 df_clean <- df %>% mutate( Start = ymd(Start), End = ymd(End), # 提取起始日期的月日作为年度锚点 start_md = str_sub(Start, 6, 10) ) # 2. 按行拆分生成周期 df_split <- df_clean %>% rowwise(ID) %>% reframe( # 生成所有时间节点:初始起始日 + 每年年末、每年对应起始日 date_nodes = c( Start, unlist(map( seq(year(Start), year(End)), ~ c(ymd(paste0(.x, "-12-31")), ymd(paste0(.x+1, "-", start_md))) )) ) ) %>% # 过滤掉超出原结束日期的无效节点 filter(date_nodes <= End) %>% # 相邻节点配对为拆分后的周期 group_by(ID) %>% mutate( Period_Start = date_nodes, Period_End = lead(date_nodes) ) %>% drop_na(Period_End) %>% # 计算周期天数,如需包含首尾两天可在计算式末尾+1 mutate(Days = as.integer(Period_End - Period_Start)) %>% select(ID, Period_Start, Period_End, Days) %>% ungroup()
结果验证
运行后输出的df_split和你给出的预期输出完全匹配,同时会自动处理所有ID行的拆分需求。
内容的提问来源于stack exchange,提问作者Sunit Kolabkar
相关产品推荐
相关产品推荐

