将迭代输出捕获到R中的data.frame中

时间:2011-04-08 12:41:23

标签: r loops

我有一个用R编写的简单回溯测试程序,用于计算测试周期的返回日期。非常简单。不是年度化,只是整体买入并持有回报。但不仅仅是一组参数。它为“一组”参数计算这些天真的回报。这需要循环,我开始创建一个显式的R循环来执行操作。这是代码及其为控制台生成的内容。

require(quantmod)

getSymbols("GLD")

for(i in seq(5, 15, 5))
  for(j in seq(50, 80, 15))

{
GLD$fast     <- SMA(Cl(GLD), n=i)     
GLD$slow     <- SMA(Cl(GLD), n=j)         

golden_cross <- Lag(ifelse(GLD$fast > GLD$slow, 1, -1))
golden_cross <- na.locf(golden_cross, na.rm=TRUE)

coin         <- ROC(Cl(GLD))*golden_cross

coin_box     <- cumprod(1+coin)
last_coin    <- coin_box[NROW(coin_box),]

coin_value   <- round((last_coin-1)*100, digits=2)

cat(i,j,coin_value,  "\n")
}

输出:

5 50 9.96 
5 65 -26.37 
5 80 -21.92 
10 50 3.09 
10 65 -13.55 
10 80 -17.98 
15 50 -6.48 
15 65 -21.79 
15 80 -9.73 

使用cat()函数将输出从循环中取出。这对我来说没用。我想让它返回一个data.frame对象,以便我可以对它进行分析。基本上,我想删除cat()调用并使用循环过程逐行创建data.frame对象。第一列为i,第二列为j,第三列为与唯一i,j次迭代相关联的值。

我已经在考虑使用不同的方法来渲染脚本。我现在使用显式R循环方法作为一种占位符。我相信在进入重新分解之前首先解决这个问题是有用的。如果您不同意,我欢迎您的意见。

编辑:

下面接受的答案代表。但我更仔细地研究了cat()函数并提出了一个问题:有没有办法将此函数的默认输出从控制台更改为文件?事实上,有。以下行将输出重定向到文件。我将文件保存到我的主目录以用于说明目的,并将其称为“test_result”(没有文件扩展名,因为它看起来更干净)。如果你没有传递append=TRUE,它只会返回从循环中派生的最后一个值。

    cat(i,j, coin_value,  "\n", file="~/test_result", append=TRUE) 

1 个答案:

答案 0 :(得分:2)

您可以使用applyexpand.grid的组合来获得您想要的内容:

fac1 <- seq(5, 15, 5)
fac2 <- seq(50, 80, 15)

Out <- apply(expand.grid(fac1,fac2),1,function(x){
  GLD$fast     <- SMA(Cl(GLD), n=x[1])
  GLD$slow     <- SMA(Cl(GLD), n=x[2])

  golden_cross <- Lag(ifelse(GLD$fast > GLD$slow, 1, -1))
  golden_cross <- na.locf(golden_cross, na.rm=TRUE)

  coin         <- ROC(Cl(GLD))*golden_cross

  coin_box     <- cumprod(1+coin)
  last_coin    <- coin_box[NROW(coin_box),]

  coin_value   <- round((last_coin-1)*100, digits=2)

return(c(x[1],x[2],Value=coin_value))
})
as.data.frame(t(Out))

给予:

  Var1 Var2  Value
1    5   50   9.96
2   10   50   3.09
3   15   50  -6.48
4    5   65 -26.37
5   10   65 -13.55
6   15   65 -21.79
7    5   80 -21.92
8   10   80 -17.98
9   15   80  -9.73