我有以下数据框
fileN<-c("510-1","510-1","510-2","510-2","510-3","510-3","510-3")
disp<-c("account","fail","fail","fail","account","account","fail")
df<-data.frame(fileN,disp)
df
fileN disp
1 510-1 account
2 510-1 fail
3 510-2 fail
4 510-2 fail
5 510-3 account
6 510-3 account
7 510-3 fail
我想获得唯一的fileN
,其中disp
同时具有fail
和account
我知道我可以执行以下操作以仅获得具有fail
的人
df %>%
group_by(fileN) %>%
filter( all(disp == 'fail')) %>%
distinct
但是如何获得同时拥有fileN
和fail
的用户中的account
,以便获得理想的结果
510-1
510-3
答案 0 :(得分:4)
一个选项是在按'fileN',filter
分组之后,其中all
的“ disp”列中存在vector
个元素,然后{ {1}}并从'fileN'中获取%in%
元素
ungroup
如果只有这些值,则另一个选择是
distinct
答案 1 :(得分:2)
基本R选项的组合
v = tapply(df$disp, df$fileN, function(x){
all(c("account", "fail") %in% x)
})
v[v]
#510-1 510-3
# TRUE TRUE
#OR
with(aggregate(disp ~ fileN, df, function(x){
all(c("account", "fail") %in% x)
}), fileN[disp])
#[1] 510-1 510-3
#Levels: 510-1 510-2 510-3