dplyr: суммировать по нескольким перекрывающимся групповым структурам и объединяться - PullRequest
2 голосов
/ 07 ноября 2019

Есть ли элегантный способ суммировать данные по различным перекрывающимся (не разъединенным) группам и присоединяться к ним?

Я хотел бы сделать следующее:

library(dplyr)
x <- data.frame(key=1:4, values=1:4)
x %>% group_by(key) 
  %>% summarize(type=1, values=sum(values)) -> tmp1
x %>% mutate(key=key%%2) 
  %>% group_by(key) 
  %>% summarize(type=2, values=sum(values)) -> tmp2
rbind(tmp1, tmp2)
# A tibble: 6 x 3
    key  type values
  <dbl> <dbl>  <int>
1     1     1      1
2     2     1      2
3     3     1      3
4     4     1      4
5     0     2      6
6     1     2      4

Возможно ли это сделать без создания объектов tmp1 и tmp2?

РЕДАКТИРОВАТЬ: Я ищу решение, которое удобно, если есть много (может быть, 1e6) перекрывающихся групп.

Например, другая группа может быть:

x %>% mutate(key=key%%3) 
  %>% group_by(key) 
  %>% summarize(type=3, values=sum(values)) -> tmp3

Могу ли ясуммировать по множеству групп и объединить результаты, как показано выше без переписывания кода для каждой группировки?

Ответы [ 3 ]

2 голосов
/ 07 ноября 2019

Вообще говоря, вы можете использовать bind_rows({summary 1}, ..., {summary n}).

bind_rows(
  {
    x %>% 
      group_by(key) %>% 
      summarize(type=1, values=sum(values))
    },
  {
    x %>% 
      mutate(key=key%%2) %>% 
      group_by(key) %>% 
      summarize(type=2, values=sum(values))
  }
)

Это тоже работает, но, на мой взгляд, не самое элегантное.

x %>% 
  group_by(key) %>% 
  summarize(type=1, values=sum(values)) %>%
  bind_rows(., {
    mutate(x, key=key%%2) %>% 
      group_by(key) %>% 
      summarize(type=2, values=sum(values))
  })

# A tibble: 6 x 3
    key  type values
  <dbl> <dbl>  <int>
1     1     1      1
2     2     1      2
3     3     1      3
4     4     1      4
5     0     2      6
6     1     2      4
1 голос
/ 07 ноября 2019

Исходя из ответа @akrun: вот что я в итоге использовал:

library(purrr)
map_dfr(c(4, 2),
        ~ x %>%
            group_by(key = key %%.x) %>%
            summarise(type = .x, values = sum(values)))

Обратите внимание, что переменные key и type имеют значения, отличные от того, что я предлагаю в вопросе. Но они по-прежнему правильно различают группы.

1 голос
/ 07 ноября 2019

Один вариант, если есть какое-либо сходство в выполняемой функции, будет map

library(purrr)
library(dplyr)
map_dfr(2:3, ~ x %>%
                group_by(key = key %%.x) %>%
                summarise(type = .x, values = sum(values))) %>% 
  bind_rows(tmp1, .)

ПРИМЕЧАНИЕ. На основании обновленного сообщения ОП

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