我有一个数据集,其来源(“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/

10-11 02:35
查看更多