2013-11-23 30 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写)。

相关问题