我有一个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”):下标超出界限
答案 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