给定一个 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
,这里只有一个,在dt1
中的ym
,我想要将当前ym
和dt1
中的上一个ym
之间v2
的值求和。也就是说,对于dt1
中的ym == 199006
,我想要返回list(v2 = 2 + 3 + 4 + 5 + 6)
。这些是dt2
中与当前ym
相等或小于当前ym
的v2
的值(不包括前一个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)]
system.time
在一个有1000万行的data.table
上只花了0.28秒。 - Señor Ofor
循环吗? - Señor Odt1[dt2,roll = -Inf]
是一个可行的方案? - joran