我正在尝试生成一个在矩阵中进行各种数学运算的函数,并将这些运算的结果存储在具有相似维度的新矩阵中。 这是一个示例矩阵(为了在数据中获得足够的可变性,其中有很多愚蠢的计算)
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中。
关于如何实现这一点的任何建议(可能通过应用函数)?
提前致谢
答案 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