2015-11-05 40 views
3

我有一个患者数据集。在这个数据集中,我有4列ID,PatientID,PhaseCode,EXAMDATE和EXCHANGE。如何根据3个IF语句选择行?

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 

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

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

请给予帮助。

回答

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))) 
+0

我不断收到此错误:“错误function_list [我]](value):找不到函数“complete” –

+0

你是否安装了最新版本的tidyr?尝试运行'install.packages(“tidyr”)' – jeremycg

+0

是的,但由于某种原因没有工作。它在不同的机器上,它工作:)谢谢! –

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