R 将矩阵转换为部分平均矩阵

R 将矩阵转换为部分平均矩阵,r,matrix,R,Matrix,我有一个320*25的矩阵,我想用这种方式转换成64*25的矩阵:新矩阵的每一行应该有旧矩阵每5行的平均值,然后它们将以类似的方式被某个向量归一化。下面您可以看到我是如何尝试实现这一点的: for (x in c(1:64)){ helping.matrix[x,] = colSums(original.matrix[((5*(x-1)+1):5*x),])/sum(vector[((5*(x- 1)+1):5*x)]) } 不幸的是,这不起作用,返回以下错误: inhe

我有一个320*25的矩阵,我想用这种方式转换成64*25的矩阵:新矩阵的每一行应该有旧矩阵每5行的平均值,然后它们将以类似的方式被某个向量归一化。下面您可以看到我是如何尝试实现这一点的:

for (x in c(1:64)){

      helping.matrix[x,] = colSums(original.matrix[((5*(x-1)+1):5*x),])/sum(vector[((5*(x-    1)+1):5*x)])

}
不幸的是,这不起作用,返回以下错误:

inheritsx,data.frame中出错:下标超出范围


好的,这可能会做到-如果你有没有NA:s的数值

m <- matrix(runif(320*25),320)
k <- 5
m2 <- rowsum(m, rep(seq(nrow(m)/k), each=k))/k

您尝试实现这一点的方式存在许多问题。首先,它有助于使示例重现:

original.matrix <- matrix(1:(320*25), nrow=320, ncol=25)
这里的索引表达式非常狂野,不符合您的要求。例如,当x=2,5*x-1+1:5*x=12,10。这与你设定的目标不符。当x=9时,表达式返回的值大于original.matrix中的行数,这就是为什么会出现越界错误。下一个问题发生在我们到达目的地时

vector[((5*(x-1)+1):5*x)])
在这里,您试图将向量作为数据对象进行索引。但向量不是一个数据对象,它是一个函数。也许你想要c5*x-1+1:5*x?无论如何,从你的问题来看,这段代码的目的并不明确,所以我不能在这里提供太多建议

好的,让我们重新开始。我解决这个问题的方法是制作一个索引向量,映射到要应用求和函数的组:

groups <- rep(1:(320/5), each=5)
接下来,使用循环或apply family函数迭代组。for-loop方法类似于

helping.matrix <- matrix(nrow=64, ncol=25)
for(i in unique(groups)) {
helping.matrix[i,] <- colSums(original.matrix[groups == i,])
}
基于应用的方法看起来像

helping.matrix <- Reduce(rbind, by(original.matrix, groups, colSums))

我省略了应该被某个向量规范化的部分,因为我不清楚那里到底应该发生什么。

比我最初想象的要简单!我已经定义了helpin.matrix。当我建立索引时,我试着这样做:例如,对于x=1,我们有5*1-1+1=1,5*x=1,这非常有帮助。matrix[1,]=colSumsoriginal.matrix[5*1-1+1:5*1],我希望这意味着帮助。matrix[1,]=colSumsoriginal.matrix[1:5,]。矩阵的第1行到第5行。答案:并不意味着分裂。向量也是一样。这种索引甚至可以用于向量!你的倒数第二个代码就是我最初想要的!Thanks@DonC5*x-1+1:5*x对x=1有效。但这是x的唯一有效值。看看c1:10{catpastex=,x,:,5*x-1+1:5*x\n}中的forx。是的,索引与向量有关,但与向量函数无关。例如,c1:10[1]是完全合理的,但向量[1]不是,除非您保存了名为vector的向量,在这种情况下,请参见install.packagesfortunes;图书馆财富;幸运狗。
helping.matrix <- matrix(nrow=64, ncol=25)
for(i in unique(groups)) {
helping.matrix[i,] <- colSums(original.matrix[groups == i,])
}
helping.matrix <- Reduce(rbind, by(original.matrix, groups, colSums))