所以我有一个数据框,按主题和每个科目的不同诊断排序。如下所示,几个受试者有不止一个诊断。我想要的是仅隔离一个诊断的受试者,即神经性厌食症。我已尝试在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
因此,我们将非常感谢任何帮助。
提前致谢
答案 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]