2016-05-11 14 views
-1

Ich möchte eine Zeitreihe (Preisdaten) basierend darauf aufteilen, ob der folgende Datenpunkt eine Erhöhung, Abnahme oder keine Änderung zeigt.R: Zeitreihendaten basierend auf Bedingungen teilen

Beispiel:

Im Set as.ts(c(1,2,3,4,5,5,4,3,2,1)) die von oben gefolgt Datenpunkte wären 1, 2, 3, 4.

Ich vermute, dass dies mit einer if-Funktion sauber gelöst werden kann, aber ich bin mir nicht sicher, wie die folgende Zeile angeben, noch bin ich sicher, wie die Syntax aussehen würde.

Jede Hilfe würde sehr geschätzt werden!

+0

Was ist Ihre erwartete Ausgabe? zwei Zeitreihen? Was hast du bisher versucht? –

+0

@ColonBeauvel die erwartete Ausgabe wäre 3 Datenrahmen, einer für jedes Ergebnis (gefolgt von oben, gefolgt von unten und keine Änderung). Ich habe versucht, eine 'if' Funktion und die' split' Funktion zu verwenden, aber konnte die nächste Zeile nicht als Bedingung angeben – youjustreadthis

Antwort

1

Sie können eine der beiden Ansätze verwendet werden:

1) Unter Verwendung diff wie folgt:

ifelse(diff(ts) > 0, 'up', ifelse(diff(ts) < 0, 'down', 'none')) 

Ausgang ist:

Time Series: 
Start = 2 
End = 10 
Frequency = 1 
[1] up up up up none down down down down 

2) Unter Verwendung der lag Funktion aus dplyr Paket:

ifelse(ts > lag(ts), 'up', ifelse(ts < lag(ts), 'down', 'none')) 
Ausgang 0

ist wie folgt:

Time Series: 
Start = 1 
End = 10 
Frequency = 1 
[1] <NA> up up up up none down down down down 

Sie können die erste NA ersetzen durch eine Standard im lag oder separat verwenden.

EDIT: Basierend auf zusätzlichen Ausgang unten pro Kommentare gewünscht, ich bin der Bearbeitung die Antwort:

Sie können das Ergebnis der oben in einem Molche speichern - zum Beispiel, und extrahieren Sie die ursprünglichen Werte, die jedem gehören der die 'bewegt' wie folgt:

newts <- c('up', ifelse(diff(ts) > 0, 'up', ifelse(diff(ts) < 0, 'down', 'none'))) 
sapply(unique(newts), function(x) ts[newts == x]) 

Ausgabe ist wie folgt:

$up 
[1] 1 2 3 4 5 

$none 
[1] 5 

$down 
[1] 4 3 2 1 

Dies sind drei Listen. Sie können mit ihnen alles tun, was Sie wollen, oder sie zu anderen Datenstrukturen kombinieren.

HINWEIS: Ich bin mit dem newts vor-schwebend, da das erste Element eine Waise ohne Bewegung ist. Je nachdem, wie Sie Dinge ausgeben möchten, sollten Sie diesen Wert nach Ihrem Geschmack anpassen.

+0

Vielen Dank dafür, es funktioniert perfekt. Mir ist klar, dass ich das in der Frage nicht angegeben habe, weshalb ich deine Antwort akzeptiert habe, aber wie würde ich die Werte notieren, gefolgt von einer Änderung in einer separaten Zeitreihe? – youjustreadthis

+1

Wenn Sie das über dem Ergebnis gespeichert haben, lassen Sie uns sagen - "Newts". Sie können alles nach dem ersten Wechsel auf "down" bringen, indem Sie etwas wie folgt verwenden: 'newts [die.max (newts == 'down'): length (newts)] ' – Gopala

+0

Nochmals, meine Frage war mehr darauf ausgerichtet, wie man für jeden Vorfall in einer Zeitreihe den entsprechenden Wert" down "erhält. Entschuldigung für Unklarheit. – youjustreadthis

Verwandte Themen