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
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
:
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?
Ich schlage vor, Sie verwenden Rcpp für einfache Schleifen. Es ist einfach, die angeforderte Logik zu replizieren.
Ihre Funktion:
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:
Drei Funktionen erzeugen die gleichen Ergebnisse und fun_c
ist die schnellste, aber die vektorisierte Funktion fun_r2
kann als akzeptabel betrachtet werden.
Viel Spaß!
Tags und Links r loops data.table time-series vectorization