如何用R语言生成日期区间内每日一行的数据集?
在R中展开日期区间为每日记录
你可以通过日期格式转换 + 生成日期序列 + 展开数据这三步实现需求,下面提供两种常用方案:
方案一:使用tidyverse工具链(推荐,代码更直观)
先加载需要的包,然后处理日期并生成每日记录:
# 加载依赖包 library(dplyr) library(lubridate) library(tidyr) # 导入你的数据 df <- structure(list(id = c(1L, 3L, 4L), date_in = c("13May2022 0:00:00", "10Nov2020 0:00:00", "25Feb2020 0:00:00"), date_out = c("03Jul2022 0:00:00", "15Nov2020 0:00:00", "05Apr2020 0:00:00"), days = c(51, 5, 40 )), class = "data.frame", row.names = c(NA, -3L)) # 步骤1:将字符型日期转换为日期时间格式 df <- df %>% mutate( date_in = dmy_hms(date_in), date_out = dmy_hms(date_out) ) # 步骤2:分组生成每日日期序列并展开 result <- df %>% group_by(id) %>% # 为每个id生成date_in到date_out的每日序列,存储为列表列 mutate(daily_date = list(seq(date_in, date_out, by = "day"))) %>% # 展开列表列为多行记录 unnest(daily_date) %>% ungroup() %>% # 可选:将datetime类型转换为纯Date类型(去掉时间部分) mutate(daily_date = as.Date(daily_date)) %>% # 调整列顺序(按需选择) select(id, daily_date, date_in, date_out, days)
方案二:使用Base R(无需额外安装包)
如果不想加载第三方包,可以用原生R函数实现:
# 导入数据 df <- structure(list(id = c(1L, 3L, 4L), date_in = c("13May2022 0:00:00", "10Nov2020 0:00:00", "25Feb2020 0:00:00"), date_out = c("03Jul2022 0:00:00", "15Nov2020 0:00:00", "05Apr2020 0:00:00"), days = c(51, 5, 40 )), class = "data.frame", row.names = c(NA, -3L)) # 步骤1:转换日期格式 df$date_in <- lubridate::dmy_hms(df$date_in) df$date_out <- lubridate::dmy_hms(df$date_out) # 步骤2:生成每个id的日期序列 date_sequences <- mapply(function(start, end) seq(start, end, by = "day"), df$date_in, df$date_out) # 步骤3:重复id和其他列,合并为最终数据集 result_base <- data.frame( id = rep(df$id, sapply(date_sequences, length)), daily_date = as.Date(unlist(date_sequences)), date_in = rep(df$date_in, sapply(date_sequences, length)), date_out = rep(df$date_out, sapply(date_sequences, length)), days = rep(df$days, sapply(date_sequences, length)) )
两种方案最终都会生成包含每日记录的数据集,每条记录对应date_in到date_out区间内的一天,同时保留原数据的id、date_in、date_out和days字段。
内容的提问来源于stack exchange,提问作者ArTu
相关产品推荐
相关产品推荐

