在R中按多个条件过滤

时间:2015-03-05 18:37:20

标签: r dataframe dplyr

所以我有一个数据框,按主题和每个科目的不同诊断排序。如下所示,几个受试者有不止一个诊断。我想要的是仅隔离一个诊断的受试者,即神经性厌食症。我已尝试在dplyr包中使用过滤功能,但到目前为止我没有运气。以下是数据样本

registeredunderid               diagnosis   social_skill_score 
            20145                    ADHD                    4
            20145        Anorexia Nervosa                    4
            20145         Bulimia Nervosa                    4
            20145              Depression                    4
            20145                      NA                    4
            20145                      NA                    4
            20145                      NA                    4
            20145                      NA                    4
            20145                      NA                    4
            20966        Anorexia Nervosa                    1
            20966                      NA                    1
            20966                      NA                    1
            20966                      NA                    1
            20966                      NA                    1
            20966                      NA                    1
            20966                      NA                    1
            20966                      NA                    1
            20966                      NA                    1
            21230        Anorexia Nervosa                    1
            21230                      NA                    1
            21230                      NA                    1
            21230                      NA                    1
            21230                      NA                    1
            21230                      NA                    1
            21230                      NA                    1
            21230                      NA                    1
            21230                      NA                    1
            27316        Anorexia Nervosa                    5
            27316         Bulimia Nervosa                    5
            27316              Depression                    5
            27316    Obsessive-Compulsive                    5

因此,我们将非常感谢任何帮助。

提前致谢

2 个答案:

答案 0 :(得分:3)

这是一个可能的基础R解决方案

indx <- with(na.omit(df), ave(as.character(diagnosis), 
             registeredunderid, FUN = function(x) length(unique(x))) == 1L & 
             diagnosis == 'Anorexia Nervosa')

na.omit(df)[indx, ]
#    registeredunderid        diagnosis social_skill_score
# 10             20966 Anorexia Nervosa                  1
# 19             21230 Anorexia Nervosa                  1

答案 1 :(得分:2)

在这里,我们可以移除NA行(na.omit)和filter这些群组(&#39; registeredunderid&#39;),其长度为&#39;诊断&#39;列为&#39; 1&#39; (n_distinct)和#Anorexia Nervosa&#39;

的值
library(dplyr)
df1%>% 
   na.omit %>%
   group_by(registeredunderid) %>%
   filter(n_distinct(diagnosis)==1L & diagnosis=='Anorexia Nervosa')

或使用与data.table类似的方法。转换&#39; data.frame&#39;到&#39; data.table&#39;使用setDT删除NA行(na.omit),根据上述条件,我们可以按group (.SD[...])对数据进行子集化。 data.table中n_distinct的等效函数是uniqueN,它是在devel版本中引入的。

  library(data.table) #data.table_1.9.5
  na.omit(setDT(df1))[, .SD[uniqueN(diagnosis)==1L & 
          diagnosis=='Anorexia Nervosa'], by = registeredunderid]
 #   registeredunderid        diagnosis social_skill_score
 #1:             20966 Anorexia Nervosa                  1
 #2:             21230 Anorexia Nervosa                  1

或者@Arun建议,

  na.omit(setDT(df1))[, .SD[all(diagnosis=='Anorexia Nervosa')],
                   by=registeredunderid]