R中data.table中的快速子集

亚历克斯

给定a 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,并且ymin dt1,我想对v2current ymindt1和last ymin之间的值求和dt1也就是说,ym == 199006dt1我想回国list(v2 = 2 + 3 + 4 + 5 + 6)这些是v2in的值dt2等于或小于当前值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)]
G.格洛腾迪克

为了避免的逻辑条件,执行的滚动加入dt1dt2然后ym在内向前移动一个位置id最后,总结了v2通过idym

setkey(dt1, id, last_ym)
setkey(dt2, id, ym)
dt1[dt2,, roll = TRUE][
       , list(v2 = v2, ym = c(last_ym[1], head(ym, -1))), by = id][
       , list(v2 = sum(v2)), by = list(id, ym)]

请注意,由于要对所有内容进行求和,last_ym因此on键dt1必须为last_ym而不是ym

结果是:

   id     ym v2
1:  1 199001  1
2:  1 199006 20
3:  1 199009 24
4:  1 199012 33

更新:更正

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章