r - 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
解决方案
我建议使用 tidyverse 包来完成这项工作,以及 tidyr 包中的spread
orpivot_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
推荐阅读
- node.js - Sequelize 不返回 queryAsync 对象
- angularjs - 如何避免两个相同的 $http.get 请求
- android - 如何从 Tensorflow Java API 访问 tflite 模型?
- java - 使用了扫描仪方法,但键盘输入未显示在命令窗口中
- c++ - 如何将用户输入传递给 char[]
- c# - 仅 4 位正则表达式模式/组匹配日期和斜线
- python - 如何从每个子组的pandas DataFrame中统一采样n行
- php - 根据 WP 编码标准清洁和消毒 php 代码
- javascript - Asp .Net Core 缓存选择 ajax 请求
- docker - 如何在 CoreOS 虚拟机上运行 Cassandra?