Существуют ли «все» значения в одной группе в любой другой группе - PullRequest
1 голос
/ 01 мая 2020

У меня есть датафрейм с 2 столбцами. Первый столбец «Альфа» представляет собой набор значений, которые принадлежат к группе. Группировка обозначена в столбце «Бета».

Что мне нужно, так это функция / l oop, что у вас есть, которая может перебирать все группы бета. Для каждой группы я хочу посмотреть, есть ли другая группа, которая содержит все значения в A другой группы, и удалить ее.

Например, моя таблица

Alpha <- c('fred','bob','tom','julie','tom','fred','fred','julie')
Beta <- c('groupA','groupA','groupA','groupB','groupB','groupB','groupC','groupC')
df <- data.frame(Alpha,Beta)

Что я хочу, чтобы произошло, чтобы увидеть, что группа C (Фред и Джул ie) также существуют в GroupB.

Таким образом, правило, что каждое значение в определенной группе должно существовать в другой группе, другая группа может иметь больше значений, чем только значения из первого , но он не может иметь некоторые, он должен иметь их все.

Я пытаюсь удалить лишние группировки.

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Вот способ для базы R с использованием by и tapply:

all_data <- by(df$Alpha, df$Beta, function(x) 
                tapply(df$Alpha, df$Beta, function(y) all(x %in% y)))

all_data
#df$Beta: groupA
#groupA groupB groupC 
#  TRUE  FALSE  FALSE 
#---------------------------------------------------------------------
#df$Beta: groupB
#groupA groupB groupC 
# FALSE   TRUE  FALSE 
#---------------------------------------------------------------------
#df$Beta: groupC
#groupA groupB groupC 
# FALSE   TRUE   TRUE 

Как мы видим в 'groupC', в 'groupB' есть полное совпадение, поэтому мы можем игнорировать 'groupC'.

total <- sapply(all_data, sum)
subset(df, !Beta %in% names(total[total > 1]))

#  Alpha   Beta
#1  fred groupA
#2   bob groupA
#3   tom groupA
#4 julie groupB
#5   tom groupB
#6  fred groupB
1 голос
/ 01 мая 2020

Базовый раствор R:

subset(df, df$Beta %in% df$Beta[grepl(paste0(Reduce(function(x,y){setdiff(x, y)}, 
       split(ordered_df$Alpha, ordered_df$Beta)), collapse = "|"), df$Alpha)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...