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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:50:04