Anwenden einer benutzerdefinierten Funktion auf data.table anstelle von plyr und ddply

8

Ich verarbeite eine data.table namens orderFlow und berechne potentialWelfare.tmp als Ausgabe. Bisher war der folgende plyr-basierte Ansatz meine Lösung, aber aufgrund der Eingabe von orderFlow mit Millionen von Zeilen würde ich eine Lösung bevorzugen, die die Leistung von data.table in R nutzt.

%Vor%

Edit1: Kurz gesagt, die benutzerdefinierte Funktion prüft, ob es mehr Gebote oder Anfragen in df gibt, und summiert die Bewertung von NbAsks nach Geboten. Dies geschieht, um die wertvollsten Gebote auszuwählen und ihre Bewertung zusammenzufassen. Der Code ist alt, wahrscheinlich nicht sehr effizient, aber er hat seinen Zweck in Kombination mit plyr und normalen data.frames erfüllt.

%Vor%

Leider kann ich keinen funktionierenden Weg finden, dies mit data.table zu implementieren. Was ich bisher mit der data.table und den entsprechenden FAQs erreicht habe, ist dies:

%Vor%

was ich bekomme ist

%Vor%

Hier ist die Eingabe:

%Vor%

Ich erwarte so etwas wie die Ausgabe, d. h. die Funktion calcPotentialWelfare aggregiert Daten auf eine besondere Art und Weise aus der Spalte 'Bewertung' der data.table orderFlow.

%Vor%

Wirklich aufgeregt zu sehen, dass das gelöst wird. Danke fürs Lesen!

Bearbeiten2:

%Vor%     
Peter Lustig 16.12.2013, 21:58
quelle

1 Antwort

17

Ich denke, das sollte schneller sein. Bei der Verwendung von data.table sind einige Fehler aufgetreten. Ich schlage vor, dass Sie die Einleitung durchlesen, Beispiele durchgehen und die FAQ lesen.

%Vor%

.SD ist eine spezielle Variable, die für jede Gruppierung eine data.table mit allen Spalten erstellt, die nicht in by= aufgeführt sind (wenn .SDcols nicht angegeben sind). Wenn .SDcols angegeben wird, wird für jede Gruppe .SD erstellt, wobei nur die angegebenen Spalten mit den Daten dieser Gruppe verwendet werden.

Die Verwendung von lapply(.SD, ...) stellt jeder Spalte die Funktion zur Verfügung, die nicht benötigt wird. Sie müssen die gesamten Daten an die Funktion senden. Da Sie in Ihrer Funktion jedoch nur die Spalten "type" und "valuation" benötigen, können Sie sie mit .SDcols=c('type', 'valuation') beschleunigen. Dies spart viel Zeit, indem die anderen Spalten ignoriert werden.

    
Arun 16.12.2013, 22:54
quelle

Tags und Links