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