如何根据 3 个 IF 语句 select 行?
How to select rows based on 3 IF statements?
我有一个患者数据集。在此数据集中,我有 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 则包含在数据集中。
请大家帮忙
我们可以使用一点tidyr
和dplyr
。首先我们 complete
PhaseCode/PatientID 的所有组合,然后我们 group_by
PatientID,然后我们从完成中删除那些有任何 NA 的患者:
library(tidyr)
library(dplyr)
dat %>% complete(PhaseCode, PatientID) %>%
group_by(PatientID) %>%
filter(!any(is.na(ID)))
subset(d, as.character(PatientID) %in%
names(which(tapply(PhaseCode, PatientID, function(x) length(unique(x)))==3)))
我有一个患者数据集。在此数据集中,我有 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 则包含在数据集中。
请大家帮忙
我们可以使用一点tidyr
和dplyr
。首先我们 complete
PhaseCode/PatientID 的所有组合,然后我们 group_by
PatientID,然后我们从完成中删除那些有任何 NA 的患者:
library(tidyr)
library(dplyr)
dat %>% complete(PhaseCode, PatientID) %>%
group_by(PatientID) %>%
filter(!any(is.na(ID)))
subset(d, as.character(PatientID) %in%
names(which(tapply(PhaseCode, PatientID, function(x) length(unique(x)))==3)))