Frage

Hallo, ich möchte eine Gruppe von Werten auswählen, die von einem Wert in einer Datentabelle abhängig sind.

Insbesondere möchte ich alle nach Datum und ID gruppierten Spalten für alle positiven Werte auswählen, bei denen e == 1 ist

   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

Hier werden alle Elemente für ID 8 und Datum 29.07.2011 und alle Elemente von ID 7 für Datum 30.07.2011 ausgewählt, da das Logret für e == 1 > 0 ist, wobei alle Elemente von ID 7 am 2011-07-2011 07-29 werden ignoriert, da das erste Logret (wobei e==1) < 0 ist

Antwort:

   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    

In SQL würde ich eine Art Unterauswahl verwenden, um dies zu erreichen.Ich würde :

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

Ich denke, dass data.table dies auch kann, aber ich finde es schwierig, es in data.table-Begriffen auszudrücken.Insbesondere kann ich Schritt 1 replizieren, aber den Join-Teil in Schritt 2 nicht ausführen.

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

Ich kann die Pos-Werte jedoch nicht wieder in mein DT einfügen

War es hilfreich?

Lösung 2

Ich habe es folgendermaßen gelöst:

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

Es würde mich interessieren, elegantere 1-Zeilen-Möglichkeiten zu erfahren, dies in data.table zu tun.


EDIT von Matthew:

Wenn key(DT) ist schon (id,date) dann wäre ein Einzeiler:

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

und das sollte auch schneller sein.Wenn Sie sich darauf verlassen können id Und date sind die ersten beiden Spalten von DT, dann kann es gekürzt werden zu:

DT[DT[e==1 & logret>0]]

Andere Tipps

Es ist nicht hübsch, und es ist nicht in data.table, aber das scheint, als würde es funktionieren: generasacodicetagpre.

Update basierend auf Kommentaren und neuen Beispieldaten

direkt von meinem Kopf (ich hatte keine jegliche -erfahrung mit dem data.table-Paket; es ist auf meiner "zu lernen" Liste).Hier ist eine mögliche Lösung: generasacodicetagpre.

update 2

Es lohnt sich auch, merge zu versuchen: generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top