Ich habe einen sehr großen Datensatz mit der Dimension 60K x 4 K
. Ich versuche, alle vier Werte nacheinander in jeder Reihe spaltenweise hinzuzufügen. Das Folgende ist ein kleineres Beispiel-Dataset.
Hier ist, was ich versuche auszuführen:
%Vor%d. füge alle vier Werte hinzu und gib es aus.
%Vor%Weiter zum Ende der Matrix (hier zu 12).
%Vor%Sobald die erste Zeile fertig ist, wenden Sie das gleiche auf die zweite Zeile an, wie:
%Vor% Das Ergebnis ist nrow x (ncol)/4
matrix.
Das erwartete Ergebnis sieht wie folgt aus:
%Vor%Ähnlich für Zeile 3 bis Anzahl der Zeilen in der Matrix. Wie kann ich das effizient loopen?
Während Matthews Antwort wirklich cool ist (+1, BTW), können Sie eine viel (~ 100x) schnellere Lösung erhalten, wenn Sie apply
vermeiden und die Funktionen *Sums
(in diesem Fall colSums
) und ein bisschen Vektor Manipulation Trickserei:
Erzeugt die gewünschte Ausgabe:
%Vor%Lasst uns jetzt etwas zur realen Größe machen und es mit den anderen Optionen vergleichen:
%Vor%Produziert:
%Vor%Und zu überprüfen:
%Vor% Der entscheidende Punkt ist, dass die *Sums
-Funktionen vollständig "vektorisiert" sind, insofern alle Berechnungen in C stattfinden. apply
muss immer noch eine Menge nicht streng vektorisierter (in der primitiven C-Funktion) machen ) Zeug in R, und ist langsamer (aber viel flexibler).
Für dieses Problem ist es vielleicht möglich, es 2-3x schneller zu machen, da etwa die Hälfte der Zeit für die Umsetzungen benötigt wird, die nur notwendig sind, damit die dim
Änderungen das tun, was ich für colSums
brauche arbeiten.
Das Aufteilen der Matrix in ein 3D-Array ist eine Möglichkeit:
%Vor% Hier ist ein weiterer Ansatz, der das RcppRoll
-Paket verwendet
Dies könnte die langsamste von allen sein:
%Vor% Vielleicht wäre die verschachtelte for-loops
langsamer, aber diese Antwort ist ziemlich nah an der Verschachtelung von for-loops
.
Tags und Links r loops large-data