2013-11-23 28 views
2

我是R編程的新手,我知道我可以編寫一個循環來執行此操作,但是我讀的所有內容都表明,爲了簡單起見,最好避免循環並使用apply。mapply - 傳遞元素的行和列作爲參數

我有一個矩陣,我想在矩陣中的每個元素上運行此函數。

cellresidue <- function(i,j){ 
    result <- (cluster[i,j] - cluster.I[i,] - cluster.J[j,] - cluster.IJ)/(cluster.N*cluster.M) 
    return (result) 
} 

i= element row 
j= element column 
cluster.J is a matrix of column means 
cluster.I is a matrix of row means 
cluster.IJ is the mean of the entire matrix named cluster 

我想不通的是我如何才能元素的行和列(我想應該用行()和塔COL()函數)mapply正在與以及如何通過這些參數適用於應用程序嗎?

+0

讀取'chisq.test'中的代碼以查看主程序如何執行類似過程可能有價值。 –

回答

0

不需要循環或*apply函數。你可以只使用純矩陣運算:

nI <- nrows(cluster) 
nJ <- ncols(cluster) 
cluster.I <- matrix(rowMeans(cluster), nI, nJ, byrow = FALSE) 
cluster.J <- matrix(rowMeans(cluster), nI, nJ, byrow = TRUE) 
cluster.IJ <- matrix( mean(cluster), nI, nJ) 

residue.mat <- (cluster - cluster.I - cluster.J - cluster.IJ)/
       (cluster.N * cluster.M) 

(你沒有解釋什麼cluster.Ncluster.M是,但我以爲他們是標量)

+1

可能已經跳過了'cluster.I'和'cluster.IJ'的構造,並且使用了'rowMeans(。)'和'mean(。)',並且只是使用了R參數回收,但它可能會更清晰。 –

+0

是的,我喜歡在我的代碼中使代碼對稱,因此它更易於閱讀和維護。表現可能不會受到影響。就像這些沒有必要的額外空間,但這使得一切都更加清潔,不是? – flodel

+0

同意,更清楚。只是試圖添加一些知識,可能會派上用場,閱讀代碼的人更關心經濟的清晰度。 –

0

它不是從你的問題不清楚是什麼你正在嘗試做的。在本網站上最好提供一些模擬數據(最好由代碼生成,而不是粘貼),然後顯示最終結果應該是什麼樣的形式。看來,apply家庭不是你所尋求的。

快速消歧之間適用,sapply和mapply:

#providing data for examples 
X=matrix(rnorm(9),3,3) 

申請:應用一個函數要麼列(2)或行(1)的矩陣或陣列

#here, sum by columns, same as colSums(X) 
apply(X, 2, sum) 

sapply:針對(通常)對象列表應用功能

#create a list with three vectors 
mylist=list(1:4, 5:10, c(1,1,1)) 
#get the mean of each vector 
sapply(mylist, mean) 

#remove 2 to each element of X, same as c(X-2) 
sapply(X, FUN=function(x) x-2) 

mapply:sapply的多變量版本,採用任意數量的參數。從來沒有太多的使用它...一些最底層的例子:

#same as c(1,2,3,4) + c(15,16,17,18) 
mapply(sum, 1:4, 15:18) 

#same as c(X+X), the vectorized matrix sum 
mapply(sum, X, X) 

注意:在R中使用循環是完全可以的;使用適合你最好的想法。問題是,如果你有一個「非常大」的迭代次數,這是你可以遇到瓶頸的地方,這取決於你的耐心。有兩種解決方案:用C/FORTRAN重寫你的函數(和提升速度),或者使用內置函數(如果適用的話,通常用C或FORTRAN寫)。

相關問題