按R中的多个条件过滤

filtering by multiple conditions in R

所以我有一个数据框,它是按受试者和每个受试者的不同诊断排序的。从下面可以看出,几个受试者有不止一种诊断。我想要的是仅隔离具有一种诊断的受试者,即神经性厌食症。我试过在 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

因此,我们将不胜感激任何帮助。

提前致谢

在这里我们可以删除 NA 行 (na.omit),以及 filter 那些具有 'diagnosis' 中唯一值长度的组 ('registeredunderid')列为“1”(n_distinct),值为 'Anorexia Nervosa'

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

或使用与 data.table 类似的方法。用setDT将'data.frame'转换为'data.table',去掉NA行(na.omit),根据上面描述的条件,我们可以通过[=20对数据进行子集化=]. 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]

这是一个可能的基础 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