我有一组医院就诊数据,我需要计算一段时间内发生的急诊室就诊情况。下面的代码模仿我的数据集的样子。医院帐户是该遭遇的唯一编号,并且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))))
答案 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))))