我有以下数据框
filen<-c('510-1','510-2','510-2','510-2','510-3','510-3','510-4')
disp<-c('g','ng','ng','ng','g','ng','ng')
df<-data.frame(filen,disp)
filen disp
1 510-1 g
2 510-2 ng
3 510-2 ng
4 510-2 ng
5 510-3 g
6 510-3 ng
7 510-4 ng
基本上,我想隔离文件编号,其中ng
是与该文件关联的唯一disp类型。这样我就得到了这样的数据集。我该如何使用dplyr
filen disp
510-2 ng
510-4 ng
答案 0 :(得分:3)
我们可以按'filen',filter
分组,其中all
'disp'值为'ng'并获得distinct
行
library(dplyr)
df %>%
group_by(filen) %>%
filter( all(disp == 'ng')) %>%
distinct
# A tibble: 2 x 2
# Groups: filen [2]
# filen disp
# <fct> <fct>
#1 510-2 ng
#2 510-4 ng
或
df %>%
distinct %>%
group_by(filen) %>%
filter(n_distinct(disp) == 1, disp == 'ng')
或者我们可以使用data.table
library(data.table)
setDT(unique(df))[, .SD[uniqueN(disp)==1 & disp == "ng"], filen]
答案 1 :(得分:1)
使用基数R,我们可以选择的一种方法是使用df
计算table
的频率,找到filen
值大于0且{{ 1}}的值等于0,并且仅保留ng
行。
g
或与unique
df1 <- as.data.frame.matrix(table(df))
unique(df[df$filen %in% rownames(df1)[df1$ng > 0 & df1$g == 0], ])
# filen disp
#2 510-2 ng
#7 510-4 ng