sukzessive vier / n Zahlen in einer großen Matrix in R addieren

7

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.

%Vor%

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?

    
SHRram 27.08.2014, 18:45
quelle

4 Antworten

9

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:

%Vor%

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.

    
BrodieG 27.08.2014, 21:28
quelle
8

Das Aufteilen der Matrix in ein 3D-Array ist eine Möglichkeit:

%Vor%     
Matthew Plourde 27.08.2014 18:54
quelle
5

Hier ist ein weiterer Ansatz, der das RcppRoll -Paket verwendet

%Vor%     
David Arenburg 27.08.2014 20:46
quelle
1

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 .

    
Mark Miller 27.08.2014 22:45
quelle

Tags und Links