4

を指定すると、そこにある項目をすばやく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 しかありません。 では、現在のと最後のの間の の値を合計ymdt1たいと思います。つまり、inを返したいからです。これらは、現在の値以下のinの値です(前の ym を除く)。コード内:v2ymdt1ymdt1ym == 199006dt1list(v2 = 2 + 3 + 4 + 5 + 6)v2dt2ym

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)]
4

2 に答える 2