Сохраните ключ, который имеет только одно определенное значение в R - PullRequest
1 голос
/ 08 июля 2019

У меня есть следующий фрейм данных

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 ]

3 голосов
/ 08 июля 2019

Мы можем сгруппировать по '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 голос
/ 08 июля 2019

Используя базу R, мы можем рассчитать частоту df, используя table, найти filen, значение ng которого больше 0, а значение g равно 0 и сохранить только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

Или с ave

unique(df[ave(df$disp == "ng", df$filen, FUN = all), ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...