2011-05-06 50 views
2

我有一个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)]) 

} 

不幸的是这没有工作,返回以下错误:

Error in inherits(x, "data.frame") : subscript out of bounds

回答

2

嗯,这可能做到这一点 - 如果你有没有NA的数字值:s ...

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

比我原先想象的要简单! – DonC 2011-05-06 17:14:03

3

您试图暗示这一点的方式存在很多问题。首先,它有助于使可再生的例子:

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

第二,如果你要使用一个for循环,你需要初始化一个对象来保存结果:

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

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

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,就好像是一个数据对象的下一个问题occures。但是vector不是数据对象,它是一个函数。也许你想c((5*(x-1)+1):5*x)?无论如何,从你的问题来看,并不清楚这个代码组的意图是什么,所以我不能在这里提供很多建议。

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

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

接下来,使用循环或申请家庭功能遍历组。 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)) 

我已经离开了那就是“通过一定的载体标准化”应该部分因为我不清楚实际应该发生的事情。

+0

+1进行彻底分析! – Tommy 2011-05-06 19:14:41

+0

我已经定义了helpin.matrix。当我索引时,我试图做到这一点:例如,对于x = 1,我们有5 *(1-1)+ 1 = 1,5 * x = 1所以'helps.matrix [1,] = colSums(original .matrix [((5 *(1-1)+ 1):5 * 1),])'这反过来我希望它意味着'help.matrix [1,] = colSums(original.matrix [(1: 5,])'。(矩阵的第1行至第5行)':'并不意味着分割,与向量一样。你倒数第二的代码就是我最初的目标!谢谢 – DonC 2011-05-06 22:40:43

+0

@DonC Well'(5 *(x-1)+1):5 * x'对x = 1有效。但这是x的唯一值。看一看'for(x in c(1:10)){cat(paste(“x =”,x,“:”),(5 *(x-1)+1):5 * x, \ n“个)}'。是的,索引与矢量一起工作,但与矢量函数无关。例如,'c(1:10)[1]'是完全合理的,但'vector [1]'不是(除非你保存了一个名为vector的向量,在这种情况下请参阅'install.packages(“fortunes” );图书馆(财富);财富(“狗”)')。 – Ista 2011-05-06 23:18:00