【问题标题】:Calculating Occupancy in hospital from dates with time.从日期和时间计算住院人数。
【发布时间】:2018-11-28 07:12:40
【问题描述】:

我希望使用 tidyverse 计算急诊科 (ED) 的占用率。在此特定问题中,入住率被理解为“入院”,但没有在入院的同一小时内离开医院。一个更清楚的例子是:如果我在 12:00:00 来到急诊室,并且在我入院的一小时内没有离开,那么我就占据了医院。因此,为此我需要创建一个新列 Occupancy。 (提供一点见解 - 我想按一天中的时间绘制入住率。但我知道如何绘制这个,但不知道如何计算入住率。因此,您无需像我一样陷入这个问题让您了解我的项目)。我需要的是学习如何从我下面的表格中计算入住率。请帮忙。

我有 ID,入场 = 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-12 02:00:00", "2012-01-12 02:59:00", "2012-01-12 
                     03:01:00", "2012-01-12 05:01:00", "2012-01-12 06:01:00", 
                    "2012-01-12 08:01:00", "2012-01-12 08:01:00"))

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

我已经从入场时间中提取了小时。这样我就可以使用新列来计算入住率 - 将手头的问题理解为已入院,但在患者入院的一小时内未出院。提醒你,我想用 tidyverse 库来做这个

df_hour <- df %>%
  mutate(Hour_Adm = lubridate::hour(as.POSIXct(Adm, "%Y%m%d %H:%M:%S"))) 

非常感谢任何帮助。谢谢你。

【问题讨论】:

  • 我认为您为主题 2、3、4、5 和 6 输入了错误的 Adm 和 Disc 日期。我已经对帖子进行了编辑。

标签: r date tidyverse


【解决方案1】:

我们可以试试

library(dplyr)
library(lubridate)

df %>% group_by(ID) %>% 
       mutate(`Stay In (Hours)` = hour(Disc) - hour(Adm), Occupancy = ifelse(hour(Disc) - hour(Adm) > 1, 1, 0)) 
       %>% ungroup()

#But notice that `hour` consider the hour's part of the time only as shown below, which may lead to misleading results:
hour(as.POSIXct(c("2012-01-12 01:40:00"))) - hour(as.POSIXct(c("2012-01-12 00:50:00")))
[1] 1

我希望的正确答案是:

df %>% group_by(ID) %>% 
       mutate(`Stay In (Hours)` = round(difftime(Disc, Adm, units='hours'),2), 
               Occupancy = ifelse(difftime(Disc, Adm, units='hours') > 1, 1, 0)) %>% 
       ungroup()

  # A tibble: 7 x 5
     ID     Adm                Disc           `Stay In (Hours)`      Occupancy
    <dbl> <dttm>              <dttm>               <time>                <dbl>
1   101 2012-01-12 00:52:00 2012-01-12 02:00:00     1.13                  1.00
2   102 2012-01-12 00:55:00 2012-01-12 02:59:00     2.07                  1.00
3   103 2012-01-12 01:35:00 2012-02-12 03:01:00    745.43                 1.00
4   104 2012-01-12 03:24:00 2012-02-12 05:01:00    745.62                 1.00
5   105 2012-01-12 04:24:00 2012-02-12 06:01:00    745.62                 1.00
6   106 2012-01-12 05:24:00 2012-02-12 08:01:00    746.62                 1.00
7   107 2012-01-12 05:28:00 2012-02-12 08:01:00    746.55                 1.00

【讨论】:

  • 非常感谢 A.Suliman。还有一个与这个问题无关的问题是我如何在 stackoverflow 上打印出数据帧,以便我可以直观地看到数据的样子。
  • 如果我正确理解您的问题。您可以使用dput(df) 然后复制粘贴dput(df) 的输出并添加到您的问题中。
  • 你好苏利曼,显然我说它有帮助是错误的。实际上并没有,因为它的停留时间与入住时间不同。实际上,我想检查在给定时间有多少病人在医院里。在我的项目中是一天中的每个小时,从 00 到 23:00。
【解决方案2】:

逻辑是在Adm时间(POSIXct类型)加上1小时(即60*60秒)并与Disc时间比较。

First & last 被添加用于ID 存在多行的情况。那么最早的Adm和最晚的Disc时间将只考虑ID


library(tidyverse)

df %>%
  group_by(ID) %>%
  mutate(occupancy = ifelse(last(Disc) > first(Adm) + 60*60, 1, 0))

给了

     ID Adm                 Disc                occupancy
  <dbl> <dttm>              <dttm>                  <dbl>
1   101 2012-01-12 00:52:00 2012-01-12 02:00:00      1.00
2   102 2012-01-12 00:55:00 2012-01-12 02:59:00      1.00
3   103 2012-02-12 01:35:00 2012-01-12 03:01:00      0   
4   104 2012-02-12 03:24:00 2012-01-12 05:01:00      0   
5   105 2012-02-12 04:24:00 2012-01-12 06:01:00      0   
6   106 2012-02-12 05:24:00 2012-01-12 08:01:00      0   
7   107 2012-02-12 05:28:00 2012-01-12 08:01:00      0  


样本数据:

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, 1326317460, 1326324660, 1326328260, 1326335460, 1326335460
), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("ID", 
"Adm", "Disc"), row.names = c(NA, -7L), class = "data.frame")

【讨论】:

  • 谢谢总理。你能解释一下这部分 - ifelse(last(Disc) > first(Adm) + 60*60,好吗?我想仔细检查一下我对这段代码的了解。
  • 非常感谢普雷姆。你能解释一下你的代码的这个小部分:last(Disc) > first(Adm) + 60*60
  • 您好 Prem,实际上我说它有帮助是错误的。它没有,因为它的停留时间与Occupancy不同。实际上,我想检查在给定时间有多少病人在医院里。在我的项目中是一天中的每个小时,从 00 到 23:00。
  • 您好 Prem,实际上我说它有帮助是错误的。它没有,因为它的停留时间与Occupancy不同。实际上,我想检查在给定时间有多少病人在医院里。在我的项目中是一天中的每个小时,从 00 到 23:00。
  • 现在这是一个完全不同的问题,所以我建议开始一个新问题。但不要忘记提及示例数据和所需的输出。
猜你喜欢
  • 2021-10-05
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多