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

R mapply-将元素的行和列作为参数传递,r,mapply,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

我是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

无需循环或
*应用
函数。您可以只使用普通矩阵运算:

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)

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

快速消除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编写的)。

可以跳过
cluster.I
cluster.IJ
构造,并使用
rowMeans(.)
mean()
并且刚刚使用了R参数循环,但是您这样做可能更清晰。是的,我更喜欢在可能的情况下使代码对称,以便更易于阅读和维护。性能可能不会受到影响。就好像这些多余的空间是不必要的,但是可以让一切变得更干净,不?同意,更清晰。我只是想增加一点知识,让那些更关心经济性和清晰性的人在阅读代码时能派上用场。谢谢,我只是想计算一个矩阵的余数,cluster.n和cluster.m是矩阵中的行数和列数。我没有发布数据,因为我认为在本例中不需要这些数据,但在将来会这样做。阅读
chisq.test
中的代码可能会有价值,以了解主机如何执行类似的过程。