Найти переменные, общие для групп для аккуратных данных в R - PullRequest
1 голос
/ 26 февраля 2020

Я ищу, чтобы найти общие случаи в группах в R, на основе аккуратного набора данных.

Я мог бы разделить наборы данных и затем присоединить их или использовать Reduce, но это кажется трудоемким, и я уверен, что должен быть способ сделать это легко для аккуратных данных, вероятно, используя dplyr и group_by() ,

Вот пример:

data <- data.frame(case = c('A', 'B', 'C', 'D', 'B', 'C', 'D', 'E'), 
                   var = c(rep(1,4), rep(2, 4)))

  case var
1    A   1
2    B   1
3    C   1
4    D   1
5    B   2
6    C   2
7    D   2
8    E   2

Я хочу, чтобы случаи были общими для переменных: 'B', 'C', 'D'. Я думаю, что это должно быть легко, но не могу найти ответ.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Группируйте по случаям, затем захватите первую строку для тех случаев, которые имеют правильное количество вхождений.

library(dplyr)
data %>% 
  group_by(case) %>%
  slice(which(n_distinct(var) == n_distinct(.$var))[1])
1 голос
/ 26 февраля 2020

После группировки по 'case', filter группам, имеющим количество различных элементов в 'var', равное всем различным элементам в 'var', ungroup и получаем distinct 'case'

library(dplyr)
data %>% 
    group_by(case) %>%
    filter(n_distinct(var) == n_distinct(.$var)) %>%
    ungroup %>%
    distinct(case)
# A tibble: 3 x 1
#  case 
#  <fct>
#1 B    
#2 C    
#3 D   

Или используя data.table

library(data.table)
setDT(data)[, .GRP[uniqueN(var) == uniqueN(data$var)], case]$case
#[1] B C D

Или используя base R

with(data, names(Filter(function(x) all(unique(var) %in% x), split(var, case))))
#[1] "B" "C" "D"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...