【发布时间】:2013-07-03 21:41:09
【问题描述】:
给定data.table,我想快速对其中的项目进行子集化。例如:
dt = data.table(a=1:10, key="a")
dt[a > 3 & a <= 7]
这仍然很慢。我知道我可以进行连接以获取单个行,但有没有办法证明 data.table 已排序以获得此类快速子集?
这就是我正在做的:
dt1 = data.table(id = 1, ym = c(199001, 199006, 199009, 199012), last_ym = c(NA, 199001, 199006, 199009), v = 1:4, key=c("id", "ym"))
dt2 = data.table(id = 1, ym = c(199001, 199002, 199003, 199004, 199005, 199006, 199007, 199008, 199009, 199010, 199011, 199012), v2 = 1:12, key=c("id","ym"))
对于每个id,这里只有1个,而dt1中的ym,我想在dt1中的当前ym和最后一个ym之间求和v2的值在dt1。也就是说,对于dt1 中的ym == 199006,我想返回list(v2 = 2 + 3 + 4 + 5 + 6)。这些是dt2 中v2 的值等于或小于当前ym(不包括前一个ym)。在代码中:
expr = expression({ #browser();
cur_id = id;
cur_ym = ym;
cur_dtb = dt2[J(cur_id)][ym <= cur_ym & ym > last_ym];
setkey(cur_dtb , ym);
list(r = sum(cur_dtb$v2))
})
dt1[,eval(expr ),by=list(id, ym)]
【问题讨论】:
-
我看不出这有多慢?在 1000 万行的
data.table上使用system.time花费了 0.28 秒。 -
是的,但如果你必须这样做 100,000 次,那太慢了!我可能不得不为我正在做的事情想出一个不同的算法。
-
你在使用
for循环吗? -
不,我不是。让我举个例子。
-
您的示例根本不适合我。 ://
标签: r join data.table subset