【发布时间】:2017-05-10 02:58:26
【问题描述】:
我有以下动物园系列:
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 列 Action,当 Spread>0 时为 1,Spread
f <-function(x){
if(x>0) y=1
else y= -1
return(y)}
prices.zoo$Action <- sapply(prices.zoo$Spread,f)
弹出警告消息:“警告消息: 在 if (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
【问题讨论】:
-
您可能希望使用
ifelse而不是if。见?ifelse。 -
感谢您的迅速回复。它起作用了:prices.zoo$Action 0,1,-1)
-
您是否也知道为什么我可以在数据框中使用 if 语句,但不能在动物园系列中使用?谢谢。
-
不清楚你在问什么,但也许使用
lapply来遍历data.frame 的变量。 SO上有很多与此方法相关的答案。 -
请提供一个可重现的示例,我们可以复制并粘贴到 R 中。显示
dput(head(prices.zoo))的输出。您收到的警告消息(它不是错误消息)表明您的设置与问题中的描述不符。
标签: r if-statement zoo