这是tidyverse 方法:-
Adm 和 Disc 之间的时间基本上是使用 seq 计算的 -
- 例如
Adm = 2012-01-12 00:52:00 & Disc = 2012-01-12 02:00:00 ID 101 之间的小时数将是 2012-01-12 00:00:00, 2012-01-12 01:00:00 & 2012-01-12 02:00:00。
这些小时使用paste 连接到每行的单个列hours_list 中,然后使用separate_rows 分成多行。
最后唯一的ID 计数是通过对入院和出院时间之间的计算小时数进行分组来计算的。
library(tidyverse)
library(lubridate)
df %>%
mutate_at(vars(Adm:Disc), funs(ymd_h(strftime(., format = "%Y-%m-%d %H")))) %>% #date-hour is separated from timestamp and then converted into POSIXct format
rowwise() %>%
mutate(hours_list = paste(seq(Adm, Disc, by = "hour"), collapse = ",")) %>% #hours between Adm & Disc are calculated and concatenated by ','
separate_rows(hours_list, sep = ",") %>% #calculated hours are separated into multiple rows
mutate(hours_list = ymd_hms(hours_list)) %>% #calculated hours are converted into POSIXct format
group_by(hours_list) %>%
summarise(patient_count = n_distinct(ID)) #unique patient count is calculated by grouping on calculated hours_list
给了
hours_list patient_count
<dttm> <int>
1 2012-01-12 00:00:00 2
2 2012-01-12 01:00:00 2
3 2012-01-12 02:00:00 2
4 2012-02-12 01:00:00 1
5 2012-02-12 02:00:00 1
6 2012-02-12 03:00:00 2
7 2012-02-12 04:00:00 2
8 2012-02-12 05:00:00 4
9 2012-02-12 06:00:00 3
10 2012-02-12 07:00:00 2
11 2012-02-12 08:00:00 2
样本数据:
df <- structure(list(ID = c(101, 102, 103, 104, 105, 106, 107), Adm = structure(c(1326309720,
1326309900, 1328990700, 1328997240, 1329000840, 1329004440, 1329004680
), class = c("POSIXct", "POSIXt"), tzone = ""), Disc = structure(c(1326313800,
1326317340, 1328995860, 1329003060, 1329006660, 1329013860, 1329013860
), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("ID",
"Adm", "Disc"), row.names = c(NA, -7L), class = "data.frame")
# ID Adm Disc
#1 101 2012-01-12 00:52:00 2012-01-12 02:00:00
#2 102 2012-01-12 00:55:00 2012-01-12 02:59:00
#3 103 2012-02-12 01:35:00 2012-02-12 03:01:00
#4 104 2012-02-12 03:24:00 2012-02-12 05:01:00
#5 105 2012-02-12 04:24:00 2012-02-12 06:01:00
#6 106 2012-02-12 05:24:00 2012-02-12 08:01:00
#7 107 2012-02-12 05:28:00 2012-02-12 08:01:00