我有一个数据集,其来源(“from”),目的地(“to”)和价格如下:
from to price
A B 28109
A D 2356
A E 4216
B A 445789
B D 123
D A 45674
D B 1979
我也想考虑回程路线的价格。例如,A-B由以下数据组成:
from to price
A B 28109
B A 445789
然后,取价格的总和(28109 + 445789)。输出将是这样的:
route total_price
A - B 473898
A - D 48030
A - E 4216
B - D 2102
我当时想运行一个for循环,但是我的数据量很大(800k行)。任何帮助将不胜感激。在此先多谢。
最佳答案
您可以通过对“从”到“对”进行排序,然后对已排序的对进行分组并求和来完成此操作。
编辑:请参阅@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
@Frank指出,此结果掩盖了路由
"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')
关于r - R中的路线产生的总收入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55266985/