Группировка по и сводная таблица в R - PullRequest
0 голосов
/ 20 марта 2020

Я только начинаю изучать R и перехожу из проекта Jupyter Notebook в документ R Markdown. У меня есть набор данных, который выглядит следующим образом:

   DATE    | ROUTE | STOP_NAME   | BOARDING
-----------------------------------------------
2020-03-09 |  1    | STOP A      |  2
2020-03-09 |  1    | STOP B      |  3
2020-03-09 |  2    | STOP C      |  1

Есть 20, XXX записей за несколько дней и 16 маршрутов. Я пытаюсь сгруппировать по DATE и ROUTE и суммировать столбец BOARDING. Я смог сделать это в Python, используя

df.groupby(['DATE','ROUTE'],as_index = False)['BOARDING'].sum().pivot('DATE','ROUTE').fillna(0)

Я смог создать таблицу в R, близкую к тому, что я хочу использовать:

groupcol1 <- c("DATE","ROUTE")
datacol1 <- ("BOARDING")
route_totals_table <- ddply(df,groupcol1,function(x) colSums(x[datacol1]))

Но это дает мне таблицу со строкой для каждой даты и маршрута. Я хочу такой стол.

   DATE    | ROUTE 1 | Route 2  | Route 3
-----------------------------------------------
2020-03-09 |   25    | 45       |  10
2020-03-10 |   36    | 69       |  22
2020-03-11 |   95    | 100      |  29

1 Ответ

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

Я бы предложил использовать пакет tidyverse для выполнения этой работы, а также функции spread или pivot_wider из пакета tidyr. Предположим, ваши данные находятся в data.frame под названием "dat":

library(tidyverse)
# using spread
dat %>%
    mutate(ROUTE = paste0("Route ", ROUTE)) %>%
    group_by(DATE, ROUTE)%>%
    summarise(BOARDING = sum(BOARDING)) %>%
    spread(ROUTE, BOARDING)
# using pivot_wider
dat %>%
    mutate(ROUTE = paste0("Route ", ROUTE)) %>%
    group_by(DATE, ROUTE)%>%
    summarise(BOARDING = sum(BOARDING)) %>%
    pivot_wider(names_from = ROUTE, values_from = BOARDING)

Оба возвращают:

  DATE          `Route 1` `Route 2`
  <chr>             <int>     <int>
1 "2020-03-09"          5         1
...