Мы можем попытаться приготовить нашу собственную функцию, чтобы найти комбинации названий городов. Она работает немного быстрее, по сравнению с combn()
:
функция
combn2 <- function(x){
n = length(x)
paste(
x[rep.int(seq_along(x)[-n], times = rev(seq_along(x))[-1])],
x[unlist(lapply(seq_along(x)[-1], ':', to = n))],
sep = '-'
)
}
проверить, если результатыправильное
cities <- list("London", "Paris", "Kyiv", "Geneva", "Tokyo")
combn2(cities)
# [1] "London-Paris" "London-Kyiv" "London-Geneva" "London-Tokyo" "Paris-Kyiv"
# [6] "Paris-Geneva" "Paris-Tokyo" "Kyiv-Geneva" "Kyiv-Tokyo" "Geneva-Tokyo"
сравнение времени для combn()
и combn2()
для городов 5К
данные
cities <- unique(maps::world.cities$name)
length(cities)
# [1] 41074
cities <- cities[1:5000]
время для
combn()
system.time(
combn(cities, 2, paste, collapse = "-")
)
# user system elapsed
# 116.02 0.01 116.33
время для
combn2()
system.time(
combn2(cities)
)
# user system elapsed
# 14.04 0.00 14.09
IЯ думаю, что большую часть времени тратит paste()
, поэтому, если вы найдете способ ядеризации paste()
, я был бы очень признателен, если бы вы сообщили мне, как вы это сделали.