Доступ к строкам дважды и группировка по c(buyer, seller)
:
# setup
library(data.table)
setDT(df)
df[, c("buyer", "seller") := .(as.character(buyer), as.character(seller))]
# aggregate
df[rep(1:.N, 2), .(total = sum(amount)), by=.(agent = c(df$buyer, df$seller))]
agent total
1: A 1
2: C 2
3: B 4
4: D 2
5: E 3
Материал df$
необходим из-за агрессивного анализа NSE, я думаю.Я не уверен, что by=
или keyby=
должны быть здесь быстрее.
Сравнительный анализ : я попробовал это с данными zx8 и обнаружил, что примерно в два раза медленнее, чем rbind
, еслиЯ переформулирую, чтобы ...
dt_big[, data.table(agent = c(buyer,seller), v = amount)][, sum(v), by=agent]
# 7.4 seconds vs 4.0 for dt_rbind with n = 10^8
Наконец, еще один быстрый, но многословный вариант:
groupingsets(dt_big,
by=c("buyer", "seller"),
sets = list("buyer", "seller"),
j = sum(amount))[is.na(buyer), buyer := seller][, sum(V1), by=buyer])
# 4.2 seconds