Группировать или агрегировать по векторам или спискам - PullRequest
1 голос
/ 26 марта 2020

Я хотел бы сгруппировать следующий data.frame по кварталу и суммировать по выборке.

Month   Quarter   Sample
1       1         c(1, 2, ...)
2       1         c(1, 3, ...)
3       1         c(2, 1, ...)
4       2         c(0, 1, ...)
5       2         c(1, 0, ...)
6       2         c(1, 1, ...)

Полученный data.frame должен выглядеть следующим образом:

Quarter   Sample
1         c(4, 6, ...)
2         c(2, 2, ...)

Вот Пример кода, который создает ту же структуру данных:

myData = data.frame(Month = c("1", "2", "3", "4", "5", "6"),
                    Quarter = c("1", "1", "1", "2", "2", "2"))

myData$Sample <- lapply(1:6,function(x) c(x,x+1))

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Вы можете использовать pmap_dbl() для суммирования значений параллельно:

library(purrr)
library(dplyr)

myData %>%
  group_by(Quarter) %>%
  summarise(Sample = list(pmap_dbl(Sample, sum))) %>%
  as.data.frame()

  Quarter  Sample
1       1    6, 9
2       2  15, 18
0 голосов
/ 26 марта 2020

Вот способ сделать это с dplyr, мы unnest данных, чтобы получить столбцы списка в отдельные rows, мы назначаем уникальный номер для каждого значения в Sample в каждой строке. Затем мы group_by Quarter получаем sum из Sample и снова получаем данные в виде списка.

library(dplyr)

out_df <- myData %>%
             tidyr::unnest(Sample) %>%
             group_by(Month) %>%
             mutate(row = row_number()) %>%
             group_by(Quarter, row) %>%
             summarise(Sample = sum(Sample)) %>%
             summarise(Sample = list(Sample)) %>% data.frame()
out_df

#  Quarter Sample
#1       1   6, 9
#2       2 15, 18
...