【发布时间】:2021-02-13 14:35:28
【问题描述】:
我正在分析多家医院的患者入院/出院数据,以发现各种不一致。
我的数据结构是这样的 -
- 行标识;只不过是记录的唯一标识符(在其他表中用作外键)
- patient_id :患者的唯一标识符键
- pack_id : 患者选择治疗的医疗包
- hospital_id:医院的唯一标识符
- admn_dt : 录取日期
- discharge_date : 患者出院日期
数据快照
row_id patient_id pack_id hosp_id admn_date discharge_date
1 1 12 1 01-01-2020 14-01-2020
2 1 62 2 03-01-2020 15-01-2020
3 1 77 1 16-01-2020 27-01-2020
4 1 86 1 18-01-2020 19-01-2020
5 1 20 2 22-01-2020 25-01-2020
6 2 55 3 01-01-2020 14-01-2020
7 2 86 3 03-01-2020 17-01-2020
8 2 72 4 16-01-2020 27-01-2020
9 1 7 1 26-01-2020 30-01-2020
10 3 54 5 14-01-2020 22-01-2020
11 3 75 5 09-02-2020 17-02-2020
12 3 26 6 22-01-2020 05-02-2020
13 4 21 7 14-04-2020 23-04-2020
14 4 12 7 23-04-2020 29-04-2020
15 5 49 8 17-03-2020 26-03-2020
16 5 35 9 27-02-2020 07-03-2020
17 6 51 10 12-04-2020 15-04-2020
18 7 31 11 11-02-2020 17-02-2020
19 8 10 12 07-03-2020 08-03-2020
20 8 54 13 20-03-2020 23-03-2020
样本dput的数据如下:
df <- structure(list(row_id = c("1", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18",
"19", "20"), patient_id = c("1", "1", "1", "1", "1", "2", "2",
"2", "1", "3", "3", "3", "4", "4", "5", "5", "6", "7", "8", "8"
), pack_id = c("12", "62", "77", "86", "20", "55", "86", "72",
"7", "54", "75", "26", "21", "12", "49", "35", "51", "31", "10",
"54"), hosp_id = c("1", "2", "1", "1", "2", "3", "3", "4", "1",
"5", "5", "6", "7", "7", "8", "9", "10", "11", "12", "13"), admn_date = structure(c(18262,
18264, 18277, 18279, 18283, 18262, 18264, 18277, 18287, 18275,
18301, 18283, 18366, 18375, 18338, 18319, 18364, 18303, 18328,
18341), class = "Date"), discharge_date = structure(c(18275,
18276, 18288, 18280, 18286, 18275, 18278, 18288, 18291, 18283,
18309, 18297, 18375, 18381, 18347, 18328, 18367, 18309, 18329,
18344), class = "Date")), row.names = c(NA, -20L), class = "data.frame")
我必须确定患者在之前治疗未出院的情况下入院的记录。为此,我使用了以下代码,从该线程 How to know customers who placed next order before delivery/receiving of earlier order? In R 获取帮助-
library(tidyverse)
df %>% arrange(patient_id, admn_date, discharge_date) %>%
mutate(sort_key = row_number()) %>%
pivot_longer(c(admn_date, discharge_date), names_to ="activity",
values_to ="date", names_pattern = "(.*)_date") %>%
mutate(activity = factor(activity, ordered = T,
levels = c("admn", "discharge")),
admitted = ifelse(activity == "admn", 1, -1)) %>%
group_by(patient_id) %>%
arrange(date, sort_key, activity, .by_group = TRUE) %>%
mutate (admitted = cumsum(admitted)) %>%
ungroup() %>%
filter(admitted >1, activity == "admn")
这很好地为我提供了患者入院但未从先前治疗中出院的所有记录。
输出-
# A tibble: 6 x 8
row_id patient_id pack_id hosp_id sort_key activity date admitted
<chr> <chr> <chr> <chr> <int> <ord> <date> <dbl>
1 2 1 62 2 2 admn 2020-01-03 2
2 4 1 86 1 4 admn 2020-01-18 2
3 5 1 20 2 5 admn 2020-01-22 2
4 9 1 7 1 6 admn 2020-01-26 2
5 7 2 86 3 8 admn 2020-01-03 2
6 8 2 72 4 9 admn 2020-01-16 2
说明-
Row_id 2 是正确的,因为它与 row_id 1 重叠
Row_id 4 是正确的,因为它与 row_id 3 重叠
Row_id 5 是正确的,因为它与 row_id 3 重叠(再次)
Row_id 9 是正确的,因为它与 row_id 3 重叠(再次)
Row_id 7 是正确的,因为它与 row_id 6 重叠
Row_id 8 是正确的,因为它与 row_id 7 重叠
现在我陷入了一个给定的验证规则,即允许患者在同一家医院入院 n 次,而无需实际验证他们之前的出院。 换句话说,我只需要提取那些病人在另一家医院住院但没有从“另一家医院出院”的记录。如果医院是一样的,group_byhosp_id 字段可以为我完成工作,但这里的情况实际上是相反的。对于相同的hosp_id,它是允许的,但对于不同的它是不允许的。
请帮助我该如何进行?
如果我可以将生成的 row_id 与其重叠记录的 row_id 映射,也许我们可以解决问题。
期望的输出-
row_id
2
5
8
因为 row_ids 4、、9 和 7 与具有相同医院 ID 的记录重叠。
提前致谢。
附:虽然已经给出了理想的解决方案,但我想知道它可以通过map/apply 函数组和/或通过 data.table 包完成吗?
【问题讨论】:
-
“因为 row_ids 4、、9 和 7 与具有相同医院 ID 的记录重叠。”你的意思是不同的医院ID吗?
-
没有@Dunois。请注意,row_id 4 违反规则,因为它与 row_id 3 重叠,其中同一患者再次入院而未从先前的记录中出院(不一定是先前的 row_id)。但是,row_id 4 和 3 都属于同一家医院(即 hosp_id 1),因此是有效的。但是,row_ids 1 和 2 都与同一患者重叠,但具有不同的 hosp_ids,因此这里违反了规则。
标签: r data.table tidyverse purrr rolling-computation