2

我是 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() 和 column col() 函数)以及如何将这些参数传递给 mapply 或 apply?

4

2 回答 2

0

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

快速消除 apply、sapply 和 mapply 之间的歧义:

#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 编写)。

于 2013-11-23T02:22:26.477 回答
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是,但我认为它们是标量)

于 2013-11-23T01:39:07.930 回答