保留在R

时间:2019-07-08 15:39:06

标签: r dplyr

我有以下数据框

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

2 个答案:

答案 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