R GROUP DATA.TABLEの値を調整した状態を選択します
-
12-12-2019 - |
質問
こんにちはデータテーブルの値で条件付きの値のグループを選択したい。
具体的には、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
.
ここでは、e== 1のLOGRETのLOGRETが> 0であるため、ID 7のすべての要素がすべての要素であるため、ID 8と日付2011-07-29のすべての要素、および日付2011-07-30のすべての要素が選択されます。2011-07-29では、最初のLogret(e== 1)が<0 なので無視されます。
ANS:
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
.
データ.tableもこれを行うことができますが、それをデータで表現するのはそれを見つけることがわかります。具体的には、ステップ1を複製できますが、ステップ2の結合部分を実行できません。
pos <- DT[e==1][logret > 0]
.
しかしPOS値に参加できない
解決 2
私はそれをラウンドで解決しました:
pos <- DT[e==1][logret > 0, list(id,date)]
ans <- DT[J(pos$id,pos$date)];
.
は、データでそれをするためにそれをするためにもう少し洗練された1行の方法を聞くことに興味があります。
Matthewから編集:
key(DT)
が既に(id,date)
の場合、1つのライナーは次のようになります。
DT[DT[e==1 & logret>0, list(id,date)]]
.
そしてそれはより速くなるべきです。id
とdate
に頼ることができれば、DT
の最初の2列である場合は、次のように短縮できます。
DT[DT[e==1 & logret>0]]
. 他のヒント
それはきれいではなく、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)]),]
.
コメントと新規サンプルデータに基づく更新
私の頭の上からすぐ(私は の経験を持っていませんでした。これが可能な解決策です:
.
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
data.table
:を試す価値がある
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
.
data.table
:を試す価値がある
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