我有一个记录病人入院情况的数据集。因此,每一份记录都有病人身份、入院日期和出院日期。病人可以在同一天出院,并在同一天再次住院到单独的医院、单独的病房或病人可以在最初记录的出院日期(嵌套转移)之前进入另一家医院。我正在尝试创建一个变量,用于计算连续的住院期间,其中包括连续转移(入院日期等于前一个出院日期)、重叠转移(前一个出院日期之前的入院日期)和嵌套转诊作为住院时间的单个插曲。下面是示例数据。
library (tidyverse)
library (lubridate)
record_no <- seq(1:16)
id <- c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2)
adm_date<- c("14 dec 2012", "10 jan 2013", "19 march 2013", "9 april 2013", "3 may 2013",
"24 May 2013",
"7 June 2013", "23 Jul 2013", "7 Nov 2014", "23 feb 2015", "13 March 2015",
"1 April 2015", "7 Nov 2014", "23 feb 2015", "13 March 2015",
"1 April 2015")
dis_date<- c("14 dec 2012", "19 jan 2013", "9 april 2013", "3 may 2013", "24 May 2013",
"4 June 2013", "24 Jul 2013", "7 Nov 2014", "23 feb 2015", "13 March 2015", "1 April 2015" ,
"3 april 2015", "23 feb 2015", "13 March 2015", "1 April 2015" ,
"3 april 2015")
ami_data <- data.frame(record_no, id, adm_date, dis_date, ) %>%
mutate (adm_date=dmy(adm_date), dis_date=dmy(dis_date)) 我可以通过group_by通过id计算每个病人的“转移”或出院的数量。
morb_seq <- ami_data %>%
arrange(id, adm_date, dis_date) %>%
group_by(id) %>%
mutate(morbseq=seq(id)) %>%
ungroup
kable(morb_seq)
> | record_no| id|adm_date |dis_date | morbseq|
> |---------:|--:|:----------|:----------|-------:|
> | 1| 1|2012-12-14 |2012-12-14 | 1|
> | 2| 1|2013-01-10 |2013-01-19 | 2|
> | 3| 1|2013-03-19 |2013-04-09 | 3|
> | 4| 1|2013-04-09 |2013-05-03 | 4|
> | 5| 1|2013-05-03 |2013-05-24 | 5|
> | 6| 1|2013-05-24 |2013-06-04 | 6|
> | 7| 1|2013-06-07 |2013-07-24 | 7|
> | 8| 1|2013-07-23 |2014-11-07 | 8|
> | 9| 1|2014-11-07 |2015-02-23 | 9|
> | 10| 1|2015-02-23 |2015-03-13 | 10|
> | 11| 1|2015-03-13 |2015-04-01 | 11|
> | 12| 1|2015-04-01 |2015-04-03 | 12|
> | 13| 2|2014-11-07 |2015-02-23 | 1|
> | 14| 2|2015-02-23 |2015-03-13 | 2|
> | 15| 2|2015-03-13 |2015-04-01 | 3|
> | 16| 2|2015-04-01 |2015-04-03 | 4|病人1出院12次,但实际上连续住院4次(连续4次:1、2、3-6和7-12)。因此,我想做的是,对于第3至6号记录,最后的分离日期是2013年- 6 -4,因此这一特定事件的停留时间(包括四个单独的分离日期)将是接纳日期(2013-03-19)和最终分离日期(2013-6-04)之间的区别,而第7-12号记录的最后释放日期为2015-4-01。如果我group_by id,并采取max(dis_date),我得到2015-4-03,这是最后一个出院日期的病人整体。
我在R里怎么做?
发布于 2022-03-08 00:37:27
这可能对你有帮助。
morb_seq %>%
group_by(id) %>%
mutate(new_stay = as.numeric(adm_date-lag(dis_date))>0,
stay_no = cumsum(if_else(is.na(new_stay),TRUE,new_stay))) %>%
group_by(id,stay_no) %>%
mutate(discharge_date=max(dis_date)) %>%
ungroup() %>%
select(!new_stay:stay_no)输出:
record_no id adm_date dis_date morbseq discharge_date
<int> <dbl> <date> <date> <int> <date>
1 1 1 2012-12-14 2012-12-14 1 2012-12-14
2 2 1 2013-01-10 2013-01-19 2 2013-01-19
3 3 1 2013-03-19 2013-04-09 3 2013-06-04
4 4 1 2013-04-09 2013-05-03 4 2013-06-04
5 5 1 2013-05-03 2013-05-24 5 2013-06-04
6 6 1 2013-05-24 2013-06-04 6 2013-06-04
7 7 1 2013-06-07 2013-07-24 7 2015-04-03
8 8 1 2013-07-23 2014-11-07 8 2015-04-03
9 9 1 2014-11-07 2015-02-23 9 2015-04-03
10 10 1 2015-02-23 2015-03-13 10 2015-04-03
11 11 1 2015-03-13 2015-04-01 11 2015-04-03
12 12 1 2015-04-01 2015-04-03 12 2015-04-03
13 13 2 2014-11-07 2015-02-23 1 2015-04-03
14 14 2 2015-02-23 2015-03-13 2 2015-04-03
15 15 2 2015-03-13 2015-04-01 3 2015-04-03
16 16 2 2015-04-01 2015-04-03 4 2015-04-03 如果您想将其折叠为每一次停留的一行,则可以将其缩短为:
morb_seq %>%
group_by(id) %>%
mutate(new_stay = as.numeric(adm_date-lag(dis_date))>0,
stay_no = cumsum(if_else(is.na(new_stay),TRUE,new_stay))) %>%
group_by(id,stay_no) %>%
summarize(discharge_date=max(dis_date))输出:
id stay_no discharge_date
<dbl> <int> <date>
1 1 1 2012-12-14
2 1 2 2013-01-19
3 1 3 2013-06-04
4 1 4 2015-04-03
5 2 1 2015-04-03 https://stackoverflow.com/questions/71388549
复制相似问题