【发布时间】:2017-11-16 10:26:59
【问题描述】:
假设我有两个 data.tables:
summary <- data.table(period = c("A","B","C","D"),
from_date = ymd(c("2017-01-01", "2017-01-03", "2017-02-08", "2017-03-07")),
to_date = ymd(c("2017-01-31", "2017-04-01", "2017-03-08", "2017-05-01"))
)
log <- data.table(date = ymd(c("2017-01-03","2017-01-20","2017-02-01","2017-03-03",
"2017-03-15","2017-03-28","2017-04-03","2017-04-23")),
event1 = c(4,8,8,4,3,4,7,3), event2 = c(1,8,7,3,8,4,6,3))
看起来像这样:
> summary
period from_date to_date
1: A 2017-01-01 2017-01-31
2: B 2017-01-03 2017-04-01
3: C 2017-02-08 2017-03-08
4: D 2017-03-07 2017-05-01
> log
date event1 event2
1: 2017-01-03 4 1
2: 2017-01-20 8 8
3: 2017-02-01 8 7
4: 2017-03-03 4 3
5: 2017-03-15 3 8
6: 2017-03-28 4 4
7: 2017-04-03 7 6
8: 2017-04-23 3 3
我想得到 summary 表中每个时间段的 event1 和 event2 的总和。
我知道我可以做到:
summary[, c("event1","event2") := .(sum(log[date>=from_date & date<=to_date, event1]),
sum(log[date>=from_date & date<=to_date, event2]))
, by=period][]
得到想要的结果:
period from_date to_date event1 event2
1: A 2017-01-01 2017-01-31 12 9
2: B 2017-01-03 2017-04-01 31 31
3: C 2017-02-08 2017-03-08 4 3
4: D 2017-03-07 2017-05-01 17 21
现在,在我的实际问题中,我有大约 30 列要求和,我可能想稍后更改,summary 有大约 35,000 行,log 有约 40,000,000 行。有没有一种有效的方法来实现这一点?
注意:这是我在这里的第一篇文章。我希望我的问题足够清楚和具体,如果我应该做些什么来改进这个问题,请提出建议。谢谢!
【问题讨论】:
-
这 30 列是“事件”列吗?
-
您可以做的一件事来提高性能是首先聚合日志数据:
agg_log = log[, .( sum1 = sum(event1), sum2 = sum(event2), by = .(date)] -
@akrun 是的,但是名称不完全是 event1 到 event30,更像是 eventa1 到 eventa10 和 eventb1 到 eventb10
标签: r data.table