mapply - 传递元素的行和列作为参数

时间:2013-11-23 01:04:03

标签: r mapply

我是R编程的新手,我知道我可以编写一个循环来执行此操作,但我读到的所有内容都表示,为了简单起见,最好避免循环并使用apply。

我有一个矩阵,我想在矩阵中的每个元素上运行这个函数。

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

我无法弄清楚的是如何获取元素的行和列(我认为应该使用mapply正在使用的row()和列col()函数)以及如何将这些参数传递给mapply或申请?

2 个答案:

答案 0 :(得分: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 :(得分:0)

从您的问题中不清楚您要做什么。最好在这个网站上提供一些模拟数据(最好由代码生成,不粘贴),然后显示最终结果应该是什么形式。似乎apply家庭不是你想要的。

快速消除申请,保证和公平之间的歧义:

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

apply :将函数应用于矩阵或数组的第(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写)。