将矩阵转换为部分平均值

时间:2011-05-06 16:14:46

标签: 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)])

}

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

  

继承错误(x,“data.frame”):下标超出界限

2 个答案:

答案 0 :(得分:3)

你试图暗示这种方式有很多问题。首先,它有助于使示例可重现:

original.matrix <- matrix(1:(320*25), nrow=320, ncol=25)

其次,如果您要使用for循环,则需要初始化一个对象以保存结果:

helping.matrix <- matrix(nrow=64, ncol=25)

好的,现在让我们来看看你的代码。

for (x in c(1:64)){
helping.matrix[x,] = colSums(original.matrix[((5*(x-1)+1):5*x),])/

这里的索引表达式非常狂野,并且不能达到您想要的效果。例如,当x = 2时,(5*(x-1)+1):5*x = 12,10。这与您声明的目标不符。在x = 9时,表达式返回的值大于original.matrix中的行数,这就是为什么你得到“越界”错误。当我们到达

时会发生下一个问题
vector[((5*(x-1)+1):5*x)])

在这里,您尝试将vector编入索引,就好像它是一个数据对象一样。但是vector不是一个数据对象,它是一个函数。也许你想要c((5*(x-1)+1):5*x)?无论如何,从你的问题中不清楚这个代码的目的是什么,所以我不能在这里给出很多建议。

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

groups <- rep(1:(320/5), each=5)

接下来,使用循环或apply-family函数迭代组。 for循环方法看起来像

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))

我遗漏了应该“按某个向量标准化”的部分,因为我不清楚实际应该在那里发生什么。

答案 1 :(得分:2)

嗯,这可能会这样做 - 如果您的数字值没有NA:s ...

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