Как найти элементы, общие по крайней мере для половины элементов в тибле R - PullRequest
1 голос
/ 15 января 2020

У меня есть отметка значений:

raw = tibble(
      labels = rep(rep(1:4,each=3),2),
       group = rep(c("A","B"), each=12),
       value = c(1,2,3,3,4,5,6,7,2,2,12,1,7,3,3,3,4,5,6,3,2,2,7,1))

Я хочу выбрать для каждой группы A и B отдельное общее значение по крайней мере в половине их для меток. Результат может быть

Res = tibble(group = c("A","B"),
       value = c("1,2,3","2,3,7"))

Будет полезно, если я найду гибкую функцию, которая сделает такой же выбор как минимум для 1/3 меток.

1 Ответ

1 голос
/ 15 января 2020

Вот один вариант, где мы делаем группировку по 'group', 'value', получаем количество различных 'меток', затем делаем группу по 'group' и filter rowss, где 'n' больше или равно количеству различных «меток» на 2, то есть на 50%, получим distinct строки «группы», «значение»

library(dplyr)
raw %>%
   group_by(group, value) %>%
   mutate(n = n_distinct(labels)) %>%
   group_by(group) %>% 
   filter(n >= n_distinct(labels)/2) %>% 
   select(-n) %>%
   ungroup %>% 
   distinct(group, value)
# A tibble: 6 x 2
#  group value
#  <chr> <dbl>
#1 A         1
#2 A         2
#3 A         3
#4 B         7
#5 B         3
#6 B         2
...