我需要创建一个新列,它总结特定观察发生的实例数量

时间:2018-02-16 22:16:14

标签: r dplyr

我有一组医院就诊数据,我需要计算一段时间内发生的急诊室就诊情况。下面的代码模仿我的数据集的样子。医院帐户是该遭遇的唯一编号,并且MRN编号对于患者是唯一的。一名患者可以拥有多个医院帐户,但只有一个MRN。

hosp.acct <- sample(10000:30000, 20, replace = F)
MRN <- c(sample(40000:60000, 6, replace = F),61212,sample(40000:60000, 6, 
replace = F),61212,sample(40000:60000, 5, replace = F),61212)
set.seed(41)   
admit.date <- Sys.Date() + sort(sample(1:30, 20))
disch.date <- admit.date
disch.date[15] <- disch.date[15] + 2
disch.date[20] <- disch.date[20] + 3
admit.type <- c(rep("ED",14), "Inpatient",rep("ED",4),"Inpatient")
patients <- data.frame(hosp.acct,MRN,admit.date,disch.date,admit.type)

数据看起来像这样

   hosp.acct   MRN admit.date disch.date admit.type
1      12265 43685 2018-02-17 2018-02-17         ED
2      26536 58422 2018-02-18 2018-02-18         ED
3      15569 59675 2018-02-20 2018-02-20         ED
4      24261 50523 2018-02-21 2018-02-21         ED
5      27088 42435 2018-02-23 2018-02-23         ED
6      20027 49420 2018-02-28 2018-02-28         ED
7      17513 61212 2018-03-01 2018-03-01         ED
8      15140 49624 2018-03-02 2018-03-02         ED
9      19561 56721 2018-03-03 2018-03-03         ED
10     19380 53224 2018-03-05 2018-03-05         ED
11     22578 54514 2018-03-06 2018-03-06         ED
12     21358 59142 2018-03-07 2018-03-07         ED
13     24919 53604 2018-03-08 2018-03-08         ED
14     29646 61212 2018-03-09 2018-03-09         ED
15     26191 44328 2018-03-10 2018-03-12  Inpatient
16     25820 56705 2018-03-11 2018-03-11         ED
17     21598 41922 2018-03-12 2018-03-12         ED
18     13708 43277 2018-03-13 2018-03-13         ED
19     29753 46511 2018-03-14 2018-03-14         ED
20     28573 61212 2018-03-17 2018-03-20  Inpatient

我的目标是在特定时间范围内(即30天内)对患者进行R计数ER访问,如果允许类型是&#34;住院患者&#34;。目标结果看起来像这样。

   hosp.acct   MRN admit.date disch.date admit.type ed.visits
1      12265 43685 2018-02-17 2018-02-17         ED         0 << Maybe NA HERE on the ED observations
2      26536 58422 2018-02-18 2018-02-18         ED         0
3      15569 59675 2018-02-20 2018-02-20         ED         0
4      24261 50523 2018-02-21 2018-02-21         ED         0
5      27088 42435 2018-02-23 2018-02-23         ED         0
6      20027 49420 2018-02-28 2018-02-28         ED         0
7      17513 61212 2018-03-01 2018-03-01         ED         0
8      15140 49624 2018-03-02 2018-03-02         ED         0
9      19561 56721 2018-03-03 2018-03-03         ED         0
10     19380 53224 2018-03-05 2018-03-05         ED         0
11     22578 54514 2018-03-06 2018-03-06         ED         0
12     21358 59142 2018-03-07 2018-03-07         ED         0
13     24919 53604 2018-03-08 2018-03-08         ED         0
14     29646 61212 2018-03-09 2018-03-09         ED         0
15     26191 44328 2018-03-10 2018-03-12  Inpatient         0  <<Only the inpatient encounters check previous ED visits
16     25820 56705 2018-03-11 2018-03-11         ED         0
17     21598 41922 2018-03-12 2018-03-12         ED         0
18     13708 43277 2018-03-13 2018-03-13         ED         0
19     29753 46511 2018-03-14 2018-03-14         ED         0
20     28573 61212 2018-03-17 2018-03-20  Inpatient         2 << This patient had two ED visits in last 30 days

我认为dplyr可能是使用的工具,但除了通过MRN和日期安排和分组之外,我不知道如何让dplyr计算在当前住院病人访问前30天发生了多少次访问。

谢谢,

布拉德

感谢每个人的贡献。在所有人的帮助下,我能够收集想法并将我认为有用的东西组合在一起。如果有人发现问题,请加入。我的解决方案如下。

library(tidyverse)
library(lubridate) 
patients.temp <- patients %>%
    mutate(admit.date = as_date(admit.date)) %>%
    filter(admit.type %in% c("Inpatient","ED")) %>%
    arrange(MRN,admit.date) %>%
    group_by(MRN) %>%
    mutate(ED.30day = map(admit.date, ~sum(admit.type == "ED" & between(admit.date, . - 30, . - 0))))

2 个答案:

答案 0 :(得分:0)

编辑:

这是一个选项:1 - 创建一个新列,其中包含每个患者最近一次访问的last.visit列。 2 - 在last.visit之前30天内过滤任何内容。 3 - 添加一个计算ED访问次数的列。

patients %>%
  group_by(MRN) %>%
  mutate(last.visit = max(admit.date)) %>%
  filter(last.visit - 30 <= admit.date) %>%
  mutate(ed.visits = length(admit.type[admit.type == "ED"])) %>%
  arrange(desc(ed.visits))

上一个回答

过滤最近30天,然后添加一个包含ED访问总数的列:

patients %>%
  group_by(MRN) %>%
  filter(admit.date >= admit.date - 30) %>%
  mutate(ed.visits = length(admit.type[admit.type == "ED"])) %>%
  filter(admit.type == "Inpatient")

返回:

hosp.acct   MRN admit.date disch.date admit.type ed.visits
      <int> <dbl> <date>     <date>     <fct>          <int>
1     24425 49799 2018-03-10 2018-03-12 Inpatient          0
2     15970 61212 2018-03-17 2018-03-20 Inpatient          2

或者,如果您不使用最后一个'过滤器',您将获得:

hosp.acct   MRN admit.date disch.date admit.type ed.visits
       <int> <dbl> <date>     <date>     <fct>          <int>
 1     14292 61212 2018-03-01 2018-03-01 ED                 2
 2     17509 61212 2018-03-09 2018-03-09 ED                 2
 3     15970 61212 2018-03-17 2018-03-20 Inpatient          2
 4     29047 46473 2018-02-17 2018-02-17 ED                 1

无论哪种方式,它都无法解决不能统计ED患者就诊次数的问题。

答案 1 :(得分:0)

我能够在dplyr的帮助下得到我需要的结果。以下是我用来获得我正在寻找的结果。感谢所有贡献的人。

library(tidyverse)
library(lubridate) 
patients.temp <- patients %>%
    mutate(admit.date = as_date(admit.date)) %>%
    filter(admit.type %in% c("Inpatient","ED")) %>%
    arrange(MRN,admit.date) %>%
    group_by(MRN) %>%
    mutate(ED.30day = map(admit.date, ~sum(admit.type == "ED" & between(admit.date, . - 30, . - 0))))