首页 > 解决方案 > R中的分组和数据透视表

问题描述

我刚刚开始学习 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

标签: rpivotplyr

解决方案


我建议使用 tidyverse 包来完成这项工作,以及 tidyr 包中的spreadorpivot_wider函数。假设您的数据位于名为“dat”的 data.frame 中:

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

推荐阅读