Создание новых столбцов на основе групп и заполнение этих столбцов суммами на основе других групп - PullRequest
0 голосов
/ 14 мая 2018

У меня есть data.frame, настроенный так:

Group 1    Group 2   count
   a          aa        1 
   b          ab        6
   c          ac        7

Я хотел бы изменить его, чтобы сообщить сумму подсчета по Группе 1 по каждой из Групп 2, например:

Group 1    aa  ab  ac
   a        1   0   0 
   b        0   6   0
   c        0   0   7

Я рассмотрел использование агрегата, расплава и приведения, но не могу найти способ разделить несколько групп на отдельные столбцы.

R: Поворот с использованием функции «распространения» возвращает меня к точке, где у меня есть таблица с несколькими строками для группы 1.

    df %>%
  group_by(`Group 1`) %>%
  mutate(id2 = sequence(n())) %>%
  spread(`Group 2`, "count")

Group 1     id2   aa   ab   ac
   a         1    1    0    0
   a         2    0    4    0
   a         3    0    0    7
   a         4    1    0    0
   a         5    1    0    0
   b         6    0    6    0
   b         7    3    0    0
   b         8    0    0    5

Мне все еще нужно уменьшить сумму до суммы для каждой записи Group 1.

Как это:

Group 1        aa   ab   ac
   a            2    4    7
   b            3    6    5

Я думал, что могу добавить агрегат в цепочку, но не могу заставить его работать с несколькими столбцами

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Я нашел решение здесь: суммировать несколько столбцов по группам с помощью tapply

Используя функцию by, я смог разделить группы.Затем я вернул его в data.frame с помощью sapply:

df <- df %>%
  group_by(`Group 1`) %>%
  mutate(id2 = sequence(n())) %>%
  spread(`Group 2`, `count`)
df[is.na(df)] <-0 # transform all missing counts to zeros
df <- by(df[,c(3:5)], df$`Group 1`, FUN = colSums)
df <- t(sapply(df, I))
df <- as.data.frame(df)
0 голосов
/ 14 мая 2018

Вы можете использовать spread от tidyr:

library(tidyr)

spread(df, Group_2, count, fill = 0)
#> # A tibble: 3 x 4
#>   Group_1    aa    ab    ac
#>   <chr>   <dbl> <dbl> <dbl>
#> 1 a           1     0     0
#> 2 b           0     6     0
#> 3 c           0     0     7

Данные

df <- tibble::tribble(~Group_1, ~Group_2,   ~count,
                      "a",          "aa",        1, 
                      "b",          "ab",        6,
                      "c",          "ac",        7)

По второму вопросу вы можете свернуть полученный data.frame, используя summarise_all или summarise_at:

df2 %>% 
  group_by(Group_1) %>% 
  summarise_at(c("aa", "ab", "ac"), sum)
#> # A tibble: 2 x 4
#>   Group_1    aa    ab    ac
#>   <fct>   <int> <int> <int>
#> 1 a           3     4     7
#> 2 b           3     6     5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...