6

こんにちは私はデータテーブルの値を条件とする値のグループを選択したいと思います。

具体的には、e == 1であるすべての正の値について、日付とIDでグループ化されたすべての列を選択したいと思います。

   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

ここでは、ID8と日付2011-07-29のすべての要素と日付2011-07-30のID7のすべての要素が選択されます。これは、e ==1のログレットが>0であるため、2011年のid7のすべての要素として- 07-29は、最初のログレット(e == 1)が0未満であるため、無視されます。

回答:

   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    

SQLでは、これを実現するために、ある種の副選択を使用します。私は...するだろう :

1) Select the id and date where e=1 and logret > 0
2) Select * join on results of subselect

data.tableでもこれを実行できると思いますが、data.tableの用語で表現するのは難しいと感じています。具体的には、ステップ1を複製できますが、ステップ2の結合部分を実行できません。

pos <- DT[e==1][logret > 0]

しかし、pos値をDTに戻すことはできません

4

2 に答える 2

3

それはきれいではなく、そうではありませんがdata.table、これはうまくいくようです:

# Recreate your data
df = read.table(header=TRUE, text="id   date    e       logret 
    7 2011-07-29 1   -0.0272275211      
    7 2011-07-29 2    0.0034229025      
    7 2011-07-29 2    0.0042622177      
    8 2011-07-29 1    0.0035662770      
    8 2011-07-29 2   -0.0015268474 
    8 2011-07-29 3    0.0013333333")
df[which(df$id != df$id[which(df$e == 1 & df$logret < 0)]),]
#   id       date e       logret
# 4  8 2011-07-29 1  0.003566277
# 5  8 2011-07-29 2 -0.001526847
# 6  8 2011-07-29 3  0.001333333
#
## Or the equivalent in "positive" terms
#
# df[which(df$id == df$id[which(df$e == 1 & df$logret > 0)]),]

コメントと新しいサンプルデータに基づいて更新

私の頭のすぐ上から(私はパッケージの経験がありませdata.tableん;それは私の「学ぶ」リストにあります)。考えられる解決策は次のとおりです。

temp = split(df, df$date)
lapply(temp, 
       function(x) 
         x[which(x$id == x$id[which(x$e == 1 & x$logret > 0)]),])
# $`2011-07-29`
#   id       date e       logret
# 4  8 2011-07-29 1  0.003566277
# 5  8 2011-07-29 2 -0.001526847
# 6  8 2011-07-29 3  0.001333333
# 
# $`2011-07-30`
#   id       date e        logret
# 7  7 2011-07-30 1  0.0044444444
# 8  7 2011-07-30 2 -0.0001111111
# 9  7 2011-07-30 3  0.0013333333

アップデート2

試す価値もありmergeます:

merge(df, df[which(df$e == 1 & df$logret > 0), c(1, 2)])
#   id       date e        logret
# 1  7 2011-07-30 1  0.0044444444
# 2  7 2011-07-30 2 -0.0001111111
# 3  7 2011-07-30 3  0.0013333333
# 4  8 2011-07-29 1  0.0035662770
# 5  8 2011-07-29 2 -0.0015268474
# 6  8 2011-07-29 3  0.0013333333
于 2012-07-26T11:55:14.270 に答える
2

私はそれをラウンドで解決しました:

pos <- DT[e==1][logret > 0, list(id,date)]
ans <- DT[J(pos$id,pos$date)];

data.tableでそれを行うためのよりエレガントな1行の方法を聞きたいと思います。


マシューからの編集:

key(DT)すでにの場合(id,date)、1つのライナーは次のようになります。

DT[DT[e==1 & logret>0, list(id,date)]]

それも速いはずです。に依存しiddate、の最初の2列にDTなることができる場合は、次のように短縮できます。

DT[DT[e==1 & logret>0]]
于 2012-07-26T13:25:06.280 に答える