我的每条路线都有大量的乘客数据集,类似于以下内容:
routes <- c("MEX-GDL", "ACA-MEX", "CUN-MTY", "MTY-CUN", "GDL-MEX", "MEX-ACA")
pax <- sample(100:500, size = 6, replace = T)
traffic <- data.frame(routes = routes, pax = pax)
routes pax
1 MEX-GDL 282
2 ACA-MEX 428
3 CUN-MTY 350
4 MTY-CUN 412
5 GDL-MEX 474
6 MEX-ACA 263
如果出发地和目的地匹配,我想对航班进行分组,以获取路线中的乘客总数-例如,将路线MEX-GDL
重命名为GDL-MEX
,反之亦然,因此我可以使用group_by()
放在数据集上。
这样的:
traffic %>% group_by(routes) %>% summarise(sum(pax))
我已经完成了以下工作,并且可以运行,但是我相信可以有一种更有效的方法来解决该问题(因为要花很多时间才能运行):
library(tidyverse)
traffic$routes <- as.character(traffic$routes)
for(route in traffic$routes){
a <- substring(route, first = 1, last = 3)
b <- substring(route, first = 5, last = 7)
aux <- which(sapply(traffic$routes, str_detect, pattern = paste0(b,"-",a)))
traffic$routes[aux] <- paste0(a,"-",b)
}
有什么建议吗?
感谢您的帮助!
注意:这是我的第一个问题,因此我希望我遵守所有准则。
答案 0 :(得分:6)
我们可以separate
分成两列,按pmax
或pmin
分组,得到sum
library(tidyverse)
traffic %>%
separate(routes, into = c("Col1", "Col2")) %>%
group_by(ColN = pmin(Col1, Col2), ColN2 = pmax(Col1, Col2)) %>%
summarise(Sum = sum(pax))
答案 1 :(得分:2)
data.table
版本
数据:(?I
READ THIS)
traffic <- data.frame(routes = I(routes), pax = pax)
library(data.table)
setDT(traffic)[,routes := sapply(strsplit(routes, split="-"), function(x) paste0(sort(x),collapse = "-"))][,.(Sum = sum(pax)), by = routes]
结果:(值因sample
函数而异)
# routes Sum
#1: GDL-MEX 621
#2: ACA-MEX 595
#3: CUN-MTY 266
?sample
一起使用,请同时使用?set.seed
。