【问题标题】:Joining multiple tables using dplyr使用 dplyr 连接多个表
【发布时间】:2018-09-25 20:01:46
【问题描述】:

我正在研究医疗保健数据。为简单起见,我只提供一个患者 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。患者在各个阶段接受 BCR_ABL 测试,如TestDate 列所示。

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

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())。 BCR_ABL 的值将从 100 开始,直到第一次测试后获得的值,然后对所有 Date 条目遵循这些值。

我一直在尝试来自dplyr 的各种joins,但没有任何成功。请提供一些帮助。

【问题讨论】:

标签: r dplyr


【解决方案1】:

在此处遵循您的代码有点困难,但您可以使用 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"))

【讨论】:

  • 感谢您的评论。正如我上面解释的那样,患者来进行随访,正是在这些随访期间,药物的剂量或品牌可能会发生变化。新剂量开始的日期记录在dateofStarting 下。 inner_join() 并不能完全解决这个问题。我正在查看单个串联的Date 变量,它是TestDatedateofStarting 的组合,每个PatientId 按时间顺序排列。谢谢
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多