wie man diesen R-Code beschleunigt

8

Ich habe einen data.frame ( Link zur Datei ) mit 18 Spalten und 11520 Zeilen, die ich so transformiere:

%Vor%

nach system.time () dauert es ungefähr so ​​lange zu laufen:

%Vor%

Dieser Aufruf ist Teil einer Webapp, also ist die Laufzeit ziemlich wichtig. Gibt es eine Möglichkeit, diesen Aufruf zu beschleunigen?

    
dnagirl 19.10.2010, 18:52
quelle

6 Antworten

9

Die Verwendung von aggregate ist ziemlich viel schneller ...

%Vor%     
Joshua Ulrich 19.10.2010, 19:51
quelle
7

Um nur einige der Punkte aus den Kommentaren zusammenzufassen:

  1. Bevor Sie mit der Optimierung beginnen, sollten Sie ein Gefühl für "akzeptable" Leistung haben. Abhängig von der erforderlichen Leistung können Sie dann genauer festlegen, wie der Code verbessert werden soll. Zum Beispiel müssten Sie bei einem bestimmten Schwellenwert aufhören, R zu verwenden und in eine kompilierte Sprache zu wechseln.
  2. Sobald Sie eine erwartete Laufzeit haben, können Sie Ihren vorhandenen Code profilieren, um mögliche Engpässe zu finden. R hat mehrere Mechanismen dafür, einschließlich Rprof (es gibt Beispiele für stackoverflow, wenn Sie nach [r] + rprof ).
  3. plyr wurde hauptsächlich für Benutzerfreundlichkeit und nicht für Leistung entwickelt (obwohl die aktuelle Version einige nette Leistungsverbesserungen hatte). Einige der Basisfunktionen sind schneller, da sie weniger Overhead haben. @JDLong zeigte auf einen netten Thread , der einige dieser Probleme behandelt, darunter auch einige spezialisierte Techniken von Hadley.
Shane 19.10.2010 19:49
quelle
4

Die Reihenfolge der Daten bei der Berechnung von Medianwerten: Wenn die Daten in der Reihenfolge vom kleinsten zum größten Wert vorliegen, ist die Berechnung etwas schneller.

%Vor%

Sortieren Sie die Daten für die neuen Datensätze nach einer entsprechenden Spalte, wenn Sie sie importieren. Für vorhandene Datensätze können Sie diese als Stapeljob (außerhalb der Web-App) sortieren.

    
Richie Cotton 20.10.2010 13:57
quelle
3

Um Joshuas Lösung hinzuzufügen. Wenn Sie sich dafür entscheiden, Mittelwert statt Mittelwert zu verwenden, können Sie die Berechnung noch viermal beschleunigen:

%Vor%     
VitoshKa 19.10.2010 21:11
quelle
2

Nun, ich habe einfach ein paar einfache Transformationen an einem großen Datenrahmen (dem Baseballdatensatz im plyr-Paket) unter Verwendung der Standardbibliotheksfunktionen (z. B. "Tabelle", "Appell", "Aggregat" usw.) und die analoge plur-Funktion - in jedem Fall fand ich plyr als wesentlich langsamer. Z. B.

%Vor%

Zweitens, und ich habe nicht untersucht, ob dies die Leistung in Ihrem Fall verbessern würde, aber für Datenrahmen der Größe, mit der Sie jetzt arbeiten und größer, verwende ich data.table Bibliothek, verfügbar auf CRAN. Es ist einfach, data.table-Objekte zu erstellen und vorhandene data.frames in data.tables zu konvertieren - rufen Sie einfach data.table auf dem data.frame auf, das Sie konvertieren möchten:

%Vor%     
doug 19.10.2010 20:57
quelle
2

Die Arbeit mit diesen Daten ist mit dplyr wesentlich schneller:

%Vor%

(Sie benötigen dplyr 0.2, um %>% und summarise_each zu erhalten)

Dies ist für plier günstiger:

%Vor%

Und an aggregate() (Code von @ joshua-ulrich)

%Vor%     
hadley 16.04.2014 15:21
quelle

Tags und Links