Как получить заданные различия и пересечение с трубопроводом группы dplyr - PullRequest
0 голосов
/ 09 января 2020

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

library(tidyverse)

dat <- tribble(
  ~category, ~status, ~content,
  1, "control", "A",
  1, "control", "Z",
  1, "treated", "A",
  1, "treated", "Z",
  1, "control", "B",
  2, "control", "C",
  2, "control", "D",
  2, "treated", "C",
  2, "treated", "F"
) %>% 
  arrange(category, status, content)


dat

Это выглядит так:

> dat
  category status  content
     <dbl> <chr>   <chr>  
1        1 control A      
2        1 control B      
3        1 control Z      
4        1 treated A      
5        1 treated Z      
6        2 control C      
7        2 control D      
8        2 treated C      
9        2 treated F    

Что я хочу сделать, это сгруппировать его по category, а затем проверить различия и пересечение content между , управление и обработано .

Выход для разностей только для control:

category    differences_control_only
1           B
2           D

Выход для разностей только для treated:

category    differences_treated_only
1           not_available
2           F

Выход для пересечения между treated и control:

  category      intersection
    1           A
    1           Z
    2           C

Итак, в конце дня , будет 3 кадра данных в качестве вывода. Как этого добиться?

В этом примере группировка основана только на одном столбце (category), в реальных случаях группировка может быть в несколько столбцов.

Ответы [ 2 ]

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

Мы можем использовать data.table

library(data.table)
setDT(dat)[,  .SD[uniqueN(status) > 1], .(category, content)]
1 голос
/ 09 января 2020

Чтобы получить различия, мы можем group_by category и content и выбрать группы, в которых есть только одна отдельная status.

library(dplyr)
dat %>% group_by(category, content) %>% filter(n_distinct(status) == 1)

#  category status  content
#     <dbl> <chr>   <chr>  
#1        1 control B      
#2        2 control D      
#3        2 treated F         

Чтобы получить пересечения, мы можем group_by category и content и выбрать группы, в которых имеется более чем один отдельный status.

dat %>%
  group_by(category, content) %>% 
  filter(n_distinct(status) >1) %>%
  distinct(category, content)

#  category content
#     <dbl> <chr>  
#1        1 A      
#2        1 Z      
#3        2 C      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...