【问题标题】:Calculating the average of people in a hospital at every hour计算医院每小时平均人数
【发布时间】:2018-11-29 08:22:21
【问题描述】:

我想用 tidyverse 计算一天中每个小时住院的平均人数。有人可以帮忙吗?

这里是 ID、Admissions (Adm) 和 Disc (Discharges)。

ID = c(101, 102,103, 104, 105, 106, 107)

Adm = as.POSIXct(c("2012-01-12 00:52:00", "2012-01-12 00:55:00", "2012-02-12 
                    01:35:00", "2012-02-12 03:24:00", "2012-02-12 04:24:00", 
                    "2012-02-12 05:24:00", "2012-02-12 05:28:00"))

Disc = as.POSIXct(c("2012-01-13 02:00:00", "2012-01-13 02:59:00", "2012-02-12 
                     03:01:00", "2012-02-12 05:01:00", "2012-02-12 06:01:00", 
                     "2012-02-12 08:01:00", "2012-02-12 08:01:00"))

df = data.frame(ID, Adm, Disc)

有人可以帮忙吗!

【问题讨论】:

  • 每一行代表一个病人?
  • 是的,ID的每一行都是一个病人,以及他的入院和出院时间。
  • 找到 Adm 2012-02-12 和同一患者 Discharges 2012-01-12 是否正常?
  • 我已更正日期。这是我选择的数据示例,而不是我正在处理的真实数据。而且,我确实弄错了。我现在已经纠正了一切,希望没有错误。总的来说,你明白了。

标签: r date average tidyverse


【解决方案1】:

这是tidyverse 方法:-

AdmDisc 之间的时间基本上是使用 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

【讨论】:

  • Hey Prem - 出现错误 - mutate_impl(.data, dots) 中的错误:评估错误:“to”必须是有限数
  • 在您的原始数据中,Disc 似乎在几行中是 NA。您可以使用df[is.na(df$Disc),] 对其进行测试。如果是这种情况,那么您可能想要删除这些行,可以通过在我的代码开头添加 df %&gt;% na.omit() 来完成。
  • 您好 Prem,我在我的数据集中发现了真正的问题。事实上,这与缺失值有关。非常感谢,普雷姆。你摇滚 :))
  • 很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多