2017-05-08 44 views
1

时,我有以下动物园系列:如果在动物园系列语句添加一列

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 

我的目标是增加一个4列行动有1时传播> 0和-1时传播< 0我尝试以下的代码:

f <-function(x){ 
if(x>0) y=1 
else y= -1 
return(y)} 

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

警告消息弹出:“警告消息: 在如果(X> 0)Y = 1000否则Y = -100: 的条件具有长度> 1且只有第一元件将被使用的” ,其结果是明显地不正确的:

  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 

但经过我转换动物园系列到一个数据帧时,一切工作:

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 

任何人都可以向我解释为什么是这样吗?有没有办法在zoo系列上实现同样的功能而不移动到数据框?

重现性实施例

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) 

^这个方法与sapply产生以下输出(未什么我寻找):

  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  

上述动物园系列被转换为数据后与sapply作品使用相同的方法:

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

你可能想使用'ifelse'而不是'if'。见'?ifelse'。 – lmo

+0

谢谢你的迅速回复。它的工作原理:prices.zoo $ Action < - ifelse(prices.zoo $ Spread> 0,1,-1) –

+0

您是否也碰巧知道为什么我可以在数据框中使用if语句但不在动物园系列中?谢谢。 –

回答

1

任何这些将工作:

# 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) 

通常情况下,我们不会使用sapply除非问题不能没有它被量化。