基于具有特定条件的两个现有表创建新表

时间:2016-04-15 17:20:08

标签: r

这可能是愚蠢的,但我有以下问题: 我有两张桌子:

1)对具有开始和结束日期的特定患者的治疗表:

  therapyID patientID startoftherapy endoftherapy
1          1       233         5.5.10       6.6.11
2          2       233         7.7.11       8.8.11
3          3       344         1.1.09       3.2.10
4          4       344         3.3.10     10.10.11
5          5       544         2.1.09       3.2.10
6          6       544         4.3.12       4.3.14
7          7       113         1.1.12       1.1.15
8          8       123         2.1.13       1.1.15
9          9       543         2.1.09       3.2.10
10        10       533         7.7.11       8.8.14

2)具有许多诊断的表,具体患者和日期和描述:

 diagnosisID dateofdiagnosis patientID diagnosis
1          11          8.8.10       233       xxx
2          22         5.10.11       233       yyy
3          33          8.9.11       233       xxx
4          44          2.2.09       344       zzz
5          55          3.3.09       344       yyy
6         666          2.2.12       123       zzz
7         777          3.3.12       123       yyy
8         555          3.2.10       543       xxx
9         203          8.8.12       533       zzz

我想创建一个新表,在治疗期间对患者进行诊断,即使用匹配标准:患者ID,开始治疗和终末治疗之间的日期。像这样:

therapyID diagnosisID patientID dateofdiagnosis diagnosis
1         1          11       233        08.08.10       xxx
2         2          22       233        05.10.11       yyy
3         2          33       233        08.09.11       xxx

我没有经验可以做到这一点,任何人都可以帮助我或指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

我们可以用`plyr:

来做
# We recreate your data.frames
df1 <- read.table(text="
therapyID patientID startoftherapy endoftherapy
1          1       233         5.5.10       6.6.11
2          2       233         7.7.11       8.8.11
3          3       344         1.1.09       3.2.10
4          4       344         3.3.10     10.10.11
5          5       544         2.1.09       3.2.10
6          6       544         4.3.12       4.3.14
7          7       113         1.1.12       1.1.15
8          8       123         2.1.13       1.1.15
9          9       543         2.1.09       3.2.10
10        10       533         7.7.11       8.8.14", h=T)

df2 <- read.table(text="
diagnosisID dateofdiagnosis patientID diagnosis
1          11          8.8.10       233       xxx
2          22         5.10.11       233       yyy
3          33          8.9.11       233       xxx
4          44          2.2.09       344       zzz
5          55          3.3.09       344       yyy
6         666          2.2.12       123       zzz
7         777          3.3.12       123       yyy
8         555          3.2.10       543       xxx
9         203          8.8.12       533       zzz", h=T)

我们加载dplyr; install.packages("dplyr")如果你没有它。

    library(dplyr)

然后我们left_join patientID。可以找到图形定义(以及更多)here。然后我们重新排列列顺序。

# we first left_join 
    left_join(df1, df2, "patientID") %>% 
      select(therapyID,diagnosisID,patientID, dateofdiagnosis, diagnosis) %>% 
      arrange(therapyID)

我们获得:

therapyID diagnosisID patientID dateofdiagnosis diagnosis
1          1          11       233          8.8.10       xxx
2          1          22       233         5.10.11       yyy
3          1          33       233          8.9.11       xxx
4          2          11       233          8.8.10       xxx

由于行顺序,输出可能与您提供的输出不同。可以使用arrange进行更改。这是你想要的吗?

修改

  

我想找出治疗期间未发生诊断日期的病例

然后,您首先需要将时间列正确转换为日期格式。此功能可以完成您的格式:

ch2date <- function(x) as.Date(x, format="%d.%m.%y")

我们可以将它包含在管道中,然后使用这些列进行过滤:

left_join(df1, df2, "patientID") %>% 
  mutate(startoftherapy  = ch2date(startoftherapy),
         endoftherapy    = ch2date(endoftherapy),
         dateofdiagnosis = ch2date(dateofdiagnosis)) %>% 
  filter(startoftherapy < dateofdiagnosis, dateofdiagnosis < endoftherapy) %>% 
  select(therapyID, diagnosisID, patientID, dateofdiagnosis, diagnosis) %>% 
  arrange(therapyID)

它能解决你的问题吗?

相关问题