R:通过循环在另一个矩阵内创建具有数学运算结果的新矩阵

时间:2014-03-10 13:01:27

标签: r for-loop matrix apply

我正在尝试生成一个在矩阵中进行各种数学运算的函数,并将这些运算的结果存储在具有相似维度的新矩阵中。 这是一个示例矩阵(为了在数据中获得足够的可变性,其中有很多愚蠢的计算)

test<-matrix(1:290,nrow=10,ncol=29) ; colnames(test)<-1979+seq(1,29)
rownames(test)<-c("a","b","c","d","e","f","g","h","i","j")
test[,4]<-rep(8)
test[7,]<-seq(1,29)
test[c(3,5,9),]<-test[c(3,5,9),] * 1/2
test[,c(4,6,8,9,10,15,16,18)]<-test[,c(4,6,8,9,10,15,16,18)]*1/3

我希望能够计算(a,1999)中的值与(a,1999)之前的3个值的平均值之间的差异。这需要灵活,适用于每个rowname(公司)和每一栏(年)。

我正在尝试构建的代码看起来像这样(我猜):

for(year in 1:29)
  for (k in 1:10)
      qw<-matrix((test[k, year] + 1/3*(- test[k, year-1] - test[k,year -2] - test[k, year-3])), nrow=10, ncol=29)

当我运行它时,此代码生成一个矩阵,但该矩阵中的值始终是最后一次计算的值(即我的示例中的20),而每个矩阵值应存储在qw中。

关于如何实现这一点的任何建议(可能通过应用函数)?

提前致谢

1 个答案:

答案 0 :(得分:0)

您正在每次迭代中创建矩阵qw。每个新矩阵都会覆盖前一个矩阵。以下是我认为你想做的事情,尽管我不知道你想要如何处理前3年。

qw <- matrix(nrow=10, ncol=29)
colnames(qw)<-1979+seq(1,29)
rownames(qw)<-c("a","b","c","d","e","f","g","h","i","j")
for(year in 4:29){
  for (k in 1:10){
    qw[k, year] <- (test[k, year] + 1/3*(- test[k, year-1] - test[k,year -2] - test[k, year-3]))
  }
}
qw

在R中,使用循环通常是个坏主意,因为有更高效的函数。以下是使用包zoo执行此操作的R方法。

require(zoo)
qw <- matrix(nrow=10, ncol=29)
colnames(qw)<-1979+seq(1,29)
rownames(qw)<-c("a","b","c","d","e","f","g","h","i","j")
qw[,4:29] <- test[,4:29]-t(head(rollmean(t(test), 3),-1))
qw