مجموعة ص حدد مشروطا بالقيمة في البيانات.الجدول

StackOverflow https://stackoverflow.com//questions/11668367

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top