use*_*926 6 select r data.table
嗨,我想选择一组以数据表中的值为条件的值.
具体来说,我想选择所有按日期和ID分组的列,以获取e == 1的所有正值
id date e logret
7 2011-07-29 1 -0.0272275211
7 2011-07-29 2 0.0034229025
7 2011-07-29 3 0.0042622177
8 2011-07-29 1 0.0035662770
8 2011-07-29 2 -0.0015268474
8 2011-07-29 3 0.0013333333
7 2011-07-30 1 0.0044444444
7 2011-07-30 2 -0.0001111111
7 2011-07-30 3 0.0013333333
Run Code Online (Sandbox Code Playgroud)
这里将列出id 8和日期2011-07-29的所有元素以及日期2011-07-30的所有id 7的元素,因为e == 1的logret> 0,其中2011年的所有元素都是id 7由于第一个logret(其中e == 1)<0,因此忽略07-29
答:
8 2011-07-29 1 0.0035662770
8 2011-07-29 2 -0.0015268474
8 2011-07-29 3 0.0013333333
7 2011-07-30 1 0.0044444444
7 2011-07-30 2 -0.0001111111
7 2011-07-30 3 0.0013333333
Run Code Online (Sandbox Code Playgroud)
在sql中我会使用某种subselect来实现这一点.我会 :
1) Select the id and date where e=1 and logret > 0
2) Select * join on results of subselect
Run Code Online (Sandbox Code Playgroud)
我认为data.table也可以做到这一点,但我发现用data.table术语表达它很棘手.具体来说,我可以复制第1步,但不能在第2步中执行连接部分.
pos <- DT[e==1][logret > 0]
Run Code Online (Sandbox Code Playgroud)
但无法将pos值加入我的DT
我已经以一种迂回的方式解决了它:
pos <- DT[e==1][logret > 0, list(id,date)]
ans <- DT[J(pos$id,pos$date)];
Run Code Online (Sandbox Code Playgroud)
有兴趣听到在 data.table 中执行此操作的任何更优雅的 1 行方法。
马修编辑:
如果key(DT)已经是(id,date),那么单行将是:
DT[DT[e==1 & logret>0, list(id,date)]]
Run Code Online (Sandbox Code Playgroud)
这也应该更快。如果您可以依赖id和date是 的前两列DT,那么它可以缩短为:
DT[DT[e==1 & logret>0]]
Run Code Online (Sandbox Code Playgroud)