使用tidyr的complete seq.Date按医院和床位填充缺失日期遇问题求助
问题解决方法
1. 先修正日期转换的关键错误
你原数据框中的as.POSIXct格式参数写错了:%M代表分钟,月份应该用%m。这个错误会导致所有日期解析异常,进而引发后续日期范围计算的报错。修正后的数据创建代码:
d1 <- data.frame(Hospital = c(1, 1, 1, 1, 2, 2,2), Room = c(100, 100, 200, 300, 145, 145, 100), dt = as.POSIXct(c('2023-04-24 10:08:38', '2023-05-10 10:09:36', '', '2023-05-10 13:51:10', '2023-04-20 18:51:10', '2023-04-24 20:51:10',''), format="%Y-%m-%d %H:%M:%S"))
2. 正确生成每个医院-床位的日期序列
你的核心问题是未按Hospital和Room分组生成日期,导致组合逻辑混乱。以下两种方法可实现需求:
方法一:用crossing生成完整组合后左连接
library(tidyverse) # 提取日期列并转换为日期格式 d1_fixed <- d1 %>% mutate(Date2 = as.Date(dt)) # 生成指定范围的日期序列 date_range <- seq.Date(as.Date("2023-04-24"), as.Date("2023-05-10"), by = "day") # 获取所有唯一的医院-床位组合(包括无记录的床位) hr_pairs <- d1_fixed %>% distinct(Hospital, Room) # 生成完整的医院-床位-日期组合,再关联原数据保留时间信息 d2 <- hr_pairs %>% crossing(Date2 = date_range) %>% left_join(d1_fixed, by = c("Hospital", "Room", "Date2"))
方法二:用group_by+complete分组填充
library(tidyverse) d1_fixed <- d1 %>% mutate(Date2 = as.Date(dt)) d2 <- d1_fixed %>% # 按医院和床位分组 group_by(Hospital, Room) %>% # 为每个组生成指定范围的日期序列 complete(Date2 = seq.Date(as.Date("2023-04-24"), as.Date("2023-05-10"), by = "day")) %>% # 取消分组 ungroup()
结果说明
两种方法都会生成每个医院的每个床位在2023-04-24至2023-05-10期间的每日记录,原数据中存在的dt值会保留,无记录日期对应的dt为NA,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者mar355
相关产品推荐
相关产品推荐

