2013-12-17 34 views
3

我有一個39列寬的矩陣,我想獲得前三列然後接下來三列的行的平均值。所以在完成所有工作後,我總共會有13列。三重將是我想使用的索引,但它只是從1:39開始創建一個向量。如何在for循環中以3進行索引R

Triple <- c(1:3, 4:6, 7:9, 10:12, 13:15, 16:18, 19:21, 22:24, 25:27, 28:30, 31:33, 34:36, 37:39) 

AveFPKM <- matrix(nrow=54175, ncol=13) 
for (i in 1:39){ 
    Ave <- rowMeans(AllFPKM[,i:i+2]) 
    AveFPKM[,i] <- Ave 
    i+2 
} 

感謝您的幫助

+0

爲什麼不將矩陣重塑爲13列,然後取平均值?你可以看看http://stackoverflow.com/questions/17752830/r-reshape-a-vector-into-multiple-columns關於重塑的一些想法 – Floris

回答

4

隨着尺寸和apply -ing的一些指定,你可以很容易地得到您的結果。這裏有一個小例子:

test <- matrix(1:36,ncol=12) 

#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] 
#[1,] 1 4 7 10 13 16 19 22 25 28 31 34 
#[2,] 2 5 8 11 14 17 20 23 26 29 32 35 
#[3,] 3 6 9 12 15 18 21 24 27 30 33 36 

現在得到各行的平均在三列的每個塊:

apply(structure(test,dim=c(3,3,4)),c(1,3),mean) 

#  [,1] [,2] [,3] [,4] 
#[1,] 4 13 22 31 
#[2,] 5 14 23 32 
#[3,] 6 15 24 33 

或者一般,假設你的列數始終是由組大小整除:

grp.row.mean <- function(x,grpsize) { 
    apply(structure(x,dim=c(nrow(x),grpsize,ncol(x)/grpsize)),c(1,3),mean) 
} 
grp.row.mean(test,3) 
+0

非常感謝,這對我們有很大的幫助。 – MeeshCompBio

1

下面是使用sapply的解決方案,同時我們知道列數正好是3的倍數的事實優勢:

sapply(1:13, function(x) { 
    i <- (x-1)*3 + 1 # Get the actual starting index 
    rowMeans(AveFPKM[,i:(i+2)]) 
})