如何根据3个IF语句选择行?

时间:2015-11-05 19:11:45

标签: r filter dataset filtering

我有一个患者数据集。在这个数据集中,我有4列ID,PatientID,PhaseCode,EXAMDATE和EXCHANGE。

ID  |  PatientID  |  PhaseCode  |  EXAMDATE  |  EXCHANGE
--------------------------------------------------------
1   |  7366       |  ADNI1      | 21/08/2015 |     1
2   |  7366       |  ADNIGO     | 21/08/2015 |     3
3   |  7366       |  ADNI2      | 21/08/2015 |     2
4   |  7363       |  ADNI1      | 21/08/2015 |     1
5   |  7363       |  ADNI1      | 21/08/2015 |     1
6   |  7366       |  ADNI1      | 21/08/2015 |     4
7   |  7366       |  ADNIGO     | 21/08/2015 |     5
8   |  7366       |  ADNIGO     | 21/08/2015 |     0
9   |  7366       |  ADNI2      | 21/08/2015 |     1

有3种类型的相(ADNI1,ADNIGO,ADNI2),其中记录了数据。您可能已经注意到患者我的相同名称重复不止一次,或者只有一个阶段的记录。

我需要帮助选择记录所有阶段的患者。例如,如果患者没有ADNI2的记录,那么我想将其删除。条件类似于:如果患者7366记录了相位代码等于ADNI1的情况,则ADNIGO和ADNI2将包含在数据集中。

请帮助。

2 个答案:

答案 0 :(得分:3)

我们可以使用一点tidyrdplyr。首先我们complete PhaseCode / PatientID的所有组合,然后我们group_by PatientID,然后我们删除那些完成NA的患者:

library(tidyr)
library(dplyr)
dat %>% complete(PhaseCode, PatientID) %>%
        group_by(PatientID) %>%
        filter(!any(is.na(ID)))

答案 1 :(得分:1)

subset(d, as.character(PatientID) %in% 
  names(which(tapply(PhaseCode, PatientID, function(x) length(unique(x)))==3)))