Ich habe folgende Zoo-Serie:If-Anweisung in Zooserie beim Hinzufügen einer Spalte
head(prices.zoo)
JetFuel HeatingOil Spread
Sep 1996 0.682 0.6794 0.0026
Oct 1996 0.703 0.7307 -0.0277
Nov 1996 0.696 0.7261 -0.0301
Dec 1996 0.693 0.7171 -0.0241
Jan 1997 0.680 0.7142 -0.0342
Feb 1997 0.619 0.6081 0.0109
Mein Ziel ist, eine vierte Spalte Aktion hinzufügen, die 1, wenn Spread> 0 und -1, wenn verbreiten Sie < 0. ich habe versucht, den folgenden Code:
f <-function(x){
if(x>0) y=1
else y= -1
return(y)}
prices.zoo$Action <- sapply(prices.zoo$Spread,f)
Eine Warnmeldung aufgetaucht: „Warnmeldung: In if (x> 0) y = 1000 sonst y = -100: die Bedingung hat Länge> 1 und nur das erste Element wird verwendet“ Und das Ergebnis ist offensichtlich falsch:
JetFuel HeatingOil Spread Action
Sep 1996 0.682 0.6794 0.0026 1
Oct 1996 0.703 0.7307 -0.0277 1
Nov 1996 0.696 0.7261 -0.0301 1
Dec 1996 0.693 0.7171 -0.0241 1
Jan 1997 0.680 0.7142 -0.0342 1
Feb 1997 0.619 0.6081 0.0109 1
Aber nachdem ich die Zoo-Serie zu einem Datenrahmen umgewandelt, alles hat funktioniert:
prices.zoo.df <- data.frame(prices.zoo)
prices.zoo.df$Action <- sapply(prices.zoo.df$Spread,f)
head(prices.zoo.df)
JetFuel HeatingOil Spread Action
Sep 1996 0.682 0.6794 0.0026 1
Oct 1996 0.703 0.7307 -0.0277 -1
Nov 1996 0.696 0.7261 -0.0301 -1
Dec 1996 0.693 0.7171 -0.0241 -1
Jan 1997 0.680 0.7142 -0.0342 -1
Feb 1997 0.619 0.6081 0.0109 1
Könnte mir bitte jemand erklären, warum das der Fall ist? Gibt es eine Möglichkeit, dasselbe in der Zoo-Serie zu erreichen, ohne in den Datenrahmen zu wechseln?
Reproduzierbare Beispiel
z <- zoo(cbind(c1 = c(1,2,3,-1,-2)),Sys.Date()+0:4)
f <-function(x){
if(x>0) y=1
else y= -1
return(y)}
z$c2 <- sapply(z$c1,f)
^Diese Methode mit sapply erzeugt die folgende Ausgabe (nicht das, was ich suche):
c1 c2
2017-05-09 1 1
2017-05-10 2 1
2017-05-11 3 1
2017-05-12 -1 1
2017-05-13 -2 1
Nachdem die obige Zooserie auf eine Daten umgewandelt wird Rahmen die gleiche Methode mit sapply funktioniert:
z <- data.frame(z)
z$c2 <- sapply(z$c1,f)
z
c1 c2
2017-05-09 1 1
2017-05-10 2 1
2017-05-11 3 1
2017-05-12 -1 -1
2017-05-13 -2 -1
Sie möchten wahrscheinlich 'ifelse' anstelle von' if' verwenden. Siehe "? Ifelse". – lmo
Vielen Dank für die schnelle Antwort. Es hat geklappt: prices.zoo $ Action <- ifelse (preise.zoo $ Spread> 0,1, -1) –
Wissen Sie auch, warum ich die if-Anweisung in einem Datenrahmen verwenden kann, aber nicht in einer Zoo-Serie? Vielen Dank. –