2017-05-08 1 views
1

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 
+1

Sie möchten wahrscheinlich 'ifelse' anstelle von' if' verwenden. Siehe "? Ifelse". – lmo

+0

Vielen Dank für die schnelle Antwort. Es hat geklappt: prices.zoo $ Action <- ifelse (preise.zoo $ Spread> 0,1, -1) –

+0

Wissen Sie auch, warum ich die if-Anweisung in einem Datenrahmen verwenden kann, aber nicht in einer Zoo-Serie? Vielen Dank. –

Antwort

1

Jedes davon funktionieren würde:

# 1 
prices.zoo$Action <- sign(prices.zoo$Spread) 

# 2 
prices.zoo$Action <- (prices.zoo$Spread > 0) - (prices.zoo$Spread < 0) 

# 3 
prices.zoo$Action <- ifelse(prices.zoo$Spread > 0, 1, -1) 

# 4 
prices.zoo$Action <- sapply(coredata(prices.zoo$Spread), f) 

Normalerweise würden wir nicht sapply verwenden, wenn das Problem nicht ohne sie vektorisiert werden können.

Verwandte Themen