如何从for循环中保存输出列表

时间:2014-11-29 20:05:47

标签: r for-loop

我有名为datres的列表,每个列表包含33个数据集。 Iam使用for loop运行全局最小方差投资组合,如下所示:

for(i in dat) {
N <- ncol(i)
Amat <- t(rbind( rep(1,N), diag(rep(1,N)), diag(rep(-1,N))))
bvec <- c(1 , rep(0,N), rep(-0.15,N))
Dmat <- cov.shrink(i) #from tawny package 
dvec <- rep(0,N)
mvw <- solve.QP( Dmat, dvec, Amat, bvec, meq = 1 )$solution #from quadprog package
names(mvw) = colnames(i)
}

它的工作,但当然只保存最后一次迭代。我不知道如何保存它们。我需要将所有33个mvw结果保存在列表中。我该怎么办?

之后,我必须使用等效的mvw数据集评估res的结果:

mvwreturns = res%*%matrix(mvw,ncol=1)

这个命令给我评估每个时期的投资组合。每个mvw数据都与一个res数据集匹配。我怎样才能做到这一点?我想知道是否必须再运行for loop

感谢任何帮助。抱歉我的英语很差。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

在循环之前启动一个空列表mvw。然后将每个数据集添加为列表中的新元素:

mvw <- NULL #initiate list
counter <- 1
for(i in dat ) { 
N <- ncol(i)
Amat <- t(rbind( rep(1,N), diag(rep(1,N)), diag(rep(-1,N))))
bvec <- c(1 , rep(0,N), rep(-0.15,N))
Dmat <- cov.shrink(i) #from tawny package 
dvec <- rep(0,N)
mvw[[counter]] <- solve.QP( Dmat, dvec, Amat, bvec, meq = 1 )$solution) #from quadprog package
#for each iteration mvw will be stored as the i-th element in a list
names(mvw[[counter]]) = names(i)
counter <- counter + 1
}

然后以与以前相同的方式再做一个小循环,做你想做的事情:

mvwreturns <- NULL
for ( i in 1:length(mvw) {
      mvwreturns[i] = res[i]%*%matrix(mvw[i],ncol=1)
}

抱歉,我没有任何数据来运行您的脚本,但您明白了。

希望它有所帮助。

答案 1 :(得分:0)

不要使用for循环,请查看mapply。将要在每个条目上运行的代码保存到一个函数中,该函数返回mvw,将datres推送到具有所述函数的mapply调用中,并且它应该为每个函数拆分结果集的列表来自datres的元素。