如何在R语言中生成同一列内两个日期间的日期序列
生成日期序列的R脚本解决方案
我完全懂你要实现的需求——基于输入表格里的请求ID、序列ID对应的起止日期,生成两个日期之间所有日期的行,同时保留对应状态对吧?下面我用tidyverse工具包来帮你搞定这个任务,步骤清晰好上手:
步骤1:准备模拟输入数据
先模拟和你描述结构一致的输入表格(这样你可以直接替换成自己的真实数据):
library(tidyverse) # 模拟你的输入表格 input_df <- tibble( 请求ID = c("REQ001", "REQ001", "REQ002"), 序列ID = c(1, 2, 1), 日期 = as.Date(c("2023-10-01", "2023-10-05", "2023-11-02")), 状态 = c("已提交", "已完成", "处理中") ) print(input_df)
输出的模拟输入大概是这样:
# A tibble: 3 × 4 请求ID 序列ID 日期 状态 <chr> <dbl> <date> <chr> 1 REQ001 1 2023-10-01 已提交 2 REQ001 2 2023-10-05 已完成 3 REQ002 1 2023-11-02 处理中
步骤2:生成完整日期序列并填充数据
核心逻辑是按请求ID分组,在每组内生成从最早到最晚日期的所有日期,再自动填充序列ID和状态:
output_df <- input_df %>% group_by(请求ID) %>% # 生成当前请求ID下的完整日期序列 complete(日期 = seq.Date(min(日期), max(日期), by = "day")) %>% # 用前向填充把状态/序列ID补到中间日期行(直到遇到新的状态节点) fill(序列ID, 状态, .direction = "down") %>% ungroup() print(output_df)
运行后就能得到你想要的目标表格:
# A tibble: 7 × 4 请求ID 日期 序列ID 状态 <chr> <date> <dbl> <chr> 1 REQ001 2023-10-01 1 已提交 2 REQ001 2023-10-02 1 已提交 3 REQ001 2023-10-03 1 已提交 4 REQ001 2023-10-04 1 已提交 5 REQ001 2023-10-05 2 已完成 6 REQ002 2023-11-02 1 处理中
小补充
- 如果你的输入数据里同一个请求ID的日期是乱序的,记得在
group_by之后加一行arrange(日期)排序,确保填充方向正确。 - 要是还没装
tidyverse,先运行install.packages("tidyverse")安装就行。
内容的提问来源于stack exchange,提问作者SMN
相关产品推荐
相关产品推荐

