مجموعة ص حدد مشروطا بالقيمة في البيانات.الجدول
-
12-12-2019 - |
سؤال
مرحبا ، أريد تحديد مجموعة من القيم مشروطة بقيمة في جدول بيانات.
على وجه التحديد ، أود تحديد جميع الأعمدة المجمعة حسب التاريخ والمعرف لجميع القيم الموجبة حيث ه = = 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
هنا سيتم تحديد جميع عناصر المعرف 8 والتاريخ 2011-07-29 وجميع عناصر المعرف 7 للتاريخ 2011-07-30 منذ لوغريت ل ه = = 1 هو > 0 حيث يتم تجاهل جميع عناصر المعرف 7 في 2011-07-29 منذ لوغريت الأول (حيث ه = = 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
في سكل كنت استخدام نوع من سوبسيلكت لتحقيق ذلك.وأود أن :
1) Select the id and date where e=1 and logret > 0
2) Select * join on results of subselect
أعتقد البيانات.يمكن للجدول القيام بذلك أيضا ، لكنني أجد أنه من الصعب التعبير عنه في البيانات.شروط الجدول.على وجه التحديد ، يمكنني تكرار الخطوة 1 ، ولكن لا يمكنني القيام بجزء الانضمام في الخطوة 2.
pos <- DT[e==1][logret > 0]
ولكن لا يمكن الانضمام إلى قيم نقاط البيع مرة أخرى في بلدي الحلق العميق
المحلول 2
لقد حلها في جولة حول الطريق :
pos <- DT[e==1][logret > 0, list(id,date)]
ans <- DT[J(pos$id,pos$date)];
سوف تكون مهتمة لسماع أي أكثر أناقة 1 طرق خط للقيام بذلك في البيانات.الجدول.
تحرير من ماثيو :
إذا key(DT)
هو بالفعل (id,date)
ثم بطانة واحدة ستكون :
DT[DT[e==1 & logret>0, list(id,date)]]
ويجب أن يكون ذلك أسرع أيضا.إذا كنت تستطيع الاعتماد على id
و date
كونها أول 2 أعمدة من DT
, ، ثم يمكن تقصيرها إلى :
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)]),]
التحديث بناء على التعليقات وبيانات العينة الجديدة
فقط من أعلى رأسي (لم يكن لدي أي تجربة مع 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