使用dplyr连接多个表

时间:2018-04-16 06:58:13

标签: r dplyr

我正在研究医疗保健数据。为简单起见,我仅提供一个患者ID的数据。每位患者都有一个唯一的ID,在一段时间内,医生会监控BCR_ABL值,如下表所示。

structure(list(PatientId = c("Hospital1_124", "Hospital1_124", 
"Hospital1_124", "Hospital1_124", "Hospital1_124", "Hospital1_124", 
"Hospital1_124"), TestDate = c("2007-11-13", "2008-09-01", "2011-02-24", 
"2013-05-01", "2016-02-16", "2017-05-12", "2017-08-29"), BCR_ABL = c(0.029, 
0, 0, 0, 0, 100, 0)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -7L), .Names = c("PatientId", "TestDate", 
"BCR_ABL"))

在治疗开始时,每位患者的BCR_ABL值均为100,理想情况下,治疗后,该值应下降至0.患者在TestDate列所示的不同阶段接受BCR_ABL检测

患者还到医院进行随访,这记录在另一张表中,其中包含随访日期以及开始服药的日期。该表如下所示:

structure(list(PatientId = c("Hospital1_124", "Hospital1_124", 
"Hospital1_124", "Hospital1_124"), FollowupDate = structure(c(11323, 
17298, 17407, 17553), class = "Date"), dateofStarting = structure(c(11323, 
17318, 17318, 17318), class = "Date"), nameTKI = c("Imatinib", 
"Imatinib", "Imatinib", "Imatinib"), brandTKI = c("Glivec", "Glivec", 
"Glivec", "Glivec"), dailydose = c("100", "400", "400", "400"
)), class = "data.frame", row.names = c(NA, -4L), .internal.selfref = <pointer: 0x0>, .Names = c("PatientId", 
"FollowupDate", "dateofStarting", "nameTKI", "brandTKI", "dailydose"
))

现在分析的目的是找出处方药(nameTKI)的功效。在我看来,最佳表示是一个折线图,x轴为Date,y轴为BCR_ABL。但是,我仍然坚持如何结合日期。我正在查看一个包含以下变量的新表:PatientIdDateBCR_ABLnameTKIbrandTKIdailydose。我不认为跟进日期太重要了。因此,Date变量必须是来自第一个表的TestDate和来自第二个表的dateofStarting的组合,按时间顺序排列所有个体患者(我可以使用{group_by() 1}}为此)。 BCR_ABL的值将从100开始,直到第一次测试后获得的值,然后跟随所有Date条目的值。

我一直在尝试来自join的各种dplyr,但没有成功。非常感谢一些帮助。

1 个答案:

答案 0 :(得分:0)

有点难以遵循您的代码,但您可以使用PatientId作为主键将表连接在一起。但是,您也应该仔细考虑数据的结构。如果第一个表位于患者/测试级别,而第二个表位于患者级别;为什么单个PatientId有多个dateofStarting值?

library(tidyverse)

t1 <- data.frame(PatientId = rep("Hospital1_124", 7),
                 TestDate = as.Date(c("2007-11-13", "2008-09-01", "2011-02-24", "2013-05-01", 
                                      "2016-02-16", "2017-05-12", "2017-08-29")), 
                 BCR_ABL = c(0.029, 0, 0, 0, 0, 100, 0), 
                 stringsAsFactors = FALSE)



t2 <- data.frame(PatientId = rep("Hospital1_124", 4),
                 FollowupDate = as.Date(c(11323, 17298, 17407, 17553), origin = "1970-01-01"),
                 dateofStarting = as.Date(c(11323, 17318, 17318, 17318), origin = "1970-01-01"),
                 nameTKI = rep("Imatinib", 4),
                 brandTKI = rep("Glivec", 4),
                 dailydose = c(100, 400, 400, 400),
                 stringsAsFactors = FALSE)


data <- t2 %>% 
  select(-FollowupDate) %>% 
  inner_join(t1, by = c("PatientId" = "PatientId"))
相关问题