R group select以data.table中的值为条件

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

use*_*926 2

我已经以一种迂回的方式解决了它:

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)

这也应该更快。如果您可以依赖iddate是 的前两列DT,那么它可以缩短为:

DT[DT[e==1 & logret>0]]
Run Code Online (Sandbox Code Playgroud)