R Programmierung: Verwenden der zuvor berechneten Zeile, um jede Zeile zu aktualisieren

8

Ich habe eine sehr große Zeitreihe und ich muss eine andere Zeitreihe basierend auf einem beliebigen Wert am Anfang und einer Änderung im aktuellen Zeitraum erstellen. Im realen Datensatz hängt diese Änderung von anderen Variablen des Datenrahmens ab, aber für einen Zweck von MWE, erstelle ich es wie folgt neu:

%Vor%

Die neue Variable value ist definiert als eigener Wert in der Vorperiode zuzüglich der change in der aktuellen Periode. Der Wert in der ersten Beobachtung wird durch eine willkürlich gewählte initial_value bestimmt. Wenn es für value keine Einschränkungen gäbe, könnte es einfach als

erstellt werden %Vor%

Dies ist sehr schnell mit data.table . Leider kann change auch von der tatsächlichen value in der vorherigen Periode abhängen. Nehmen wir an, dass die Serie jedes Mal, wenn sie 102 erreicht, in der nächsten Periode zu initial_value gelangen und dort für 3 Perioden bleiben muss. Daher muss ich im folgenden Datenrahmen die Variable value erstellen, während der obige Code value0 :

erzeugt %Vor%

Bisher ist die einzige Möglichkeit, dieses Ergebnis zu erzielen, die Verwendung einer Schleife:

%Vor%

Allerdings ist das Überschleifen (Dutzende) von Millionen von Beobachtungen extrem langsam. Gibt es eine Möglichkeit, sie zu vektorisieren oder einfach den Prozess effizienter zu führen?

    
Radek Janhuba 27.09.2017, 07:12
quelle

1 Antwort

6

Ich schlage vor, Sie verwenden Rcpp für einfache Schleifen. Es ist einfach, die angeforderte Logik zu replizieren.
Ihre Funktion:

%Vor%

Gleiche Funktion in C ++

%Vor%

UPDATE: Die R-Funktion, die zum ersten Mal geschrieben wurde (oben), basiert auf data.frame subsetting, was eine sehr ineffektive Art ist, mit Daten in R umzugehen. Funktion ist einfach ein Underdog, der in allen Benchmarks zu verlieren erwartet wird. Während der Schleife sollte man immer Vektoren (Vektoren und Matrix) berechnen. Unterhalb der Funktion, die mehr mit Rcpp konkurrieren Beispiel:

%Vor%

Drei Funktionen erzeugen die gleichen Ergebnisse und fun_c ist die schnellste, aber die vektorisierte Funktion fun_r2 kann als akzeptabel betrachtet werden.

%Vor%

Viel Spaß!

    
Gonzo 27.09.2017, 08:39
quelle