2011-05-06 82 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