R - поиск шаблона в столбце и его замена (более эффективное решение) - PullRequest
0 голосов
/ 31 октября 2018

У меня большой набор данных о пассажирах на маршруте, подобный следующему:

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)
}

Есть предложения?

Спасибо за помощь!

Примечание: это мой первый вопрос, поэтому я надеюсь, что выполнил все рекомендации.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

data.table версия

данные: (?I ПРОЧИТАЙТЕ )

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.
0 голосов
/ 31 октября 2018

Мы можем 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))
...