我有以下动物园系列:
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列操作,当点差> 0时为1,当Spread< 0时为-1。我尝试了以下代码:
f <-function(x){
if(x>0) y=1
else y= -1
return(y)}
prices.zoo$Action <- sapply(prices.zoo$Spread,f)
弹出警告消息:&#34;警告消息: 在if(x> 0)y = 1000,否则y = -100: 条件的长度> 1,只使用第一个元素&#34; 结果显然不正确:
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
有人可以向我解释为什么会这样吗?有没有办法在动物园系列上实现同样的东西而不转移到数据框?
可重复的示例
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
答案 0 :(得分: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
,除非没有它就无法对问题进行矢量化。