Вы можете сделать это, отсортировав пары from-to, затем сгруппировав эту отсортированную пару и суммировав.
Редактировать: См. Ответ @JasonAizkalns для Tidyverse эквивалента
library(data.table)
setDT(df)
df[, .(total_price = sum(price))
, by = .(route = paste(pmin(from, to), '-', pmax(from, to)))]
# route total_price
# 1: A - B 473898
# 2: A - D 48030
# 3: A - E 4216
# 4: B - D 2102
@ Фрэнк отмечает, что этот результат скрывает тот факт, что маршрут "A - E"
не является полным, в том смысле, что нет строки исходных данных с from == 'E'
и to == 'A'
. Он предложил хороший способ сбора этой информации (и многое другое), и я добавил несколько других ниже.
df[, .(total_price = sum(price), complete = .N > 1)
, by = .(route = paste(pmin(from, to), '-', pmax(from, to)))]
# route total_price complete
# 1: A - B 473898 TRUE
# 2: A - D 48030 TRUE
# 3: A - E 4216 FALSE
# 4: B - D 2102 TRUE
df[, .(total_price = sum(price), paths_counted = .(paste(from, '-', to)))
, by = .(route = paste(pmin(from, to), '-', pmax(from, to)))]
# route total_price paths_counted
# 1: A - B 473898 A - B,B - A
# 2: A - D 48030 A - D,D - A
# 3: A - E 4216 A - E
# 4: B - D 2102 B - D,D - B
Используемые данные
df <- fread('
from to price
A B 28109
A D 2356
A E 4216
B A 445789
B D 123
D A 45674
D B 1979')