按行应用函数但在R

时间:2016-01-20 00:36:28

标签: r matrix apply

我正在尝试应用一个带矩阵的函数,并将每个元素除以其行的总和。具体来说,我有矩阵

mat <- matrix(1:10, nrow = 2) 

我将函数calculateContributions应用于每一行,如下所示:

apply(mat, 1, calculateContributions) 

calculateContributions函数已定义:

calculateContributions <- function(X){
  return(X/sum(X))
}

这给了我需要的结果,但由于apply函数非常慢,我需要多次计算,这个解决方案并不好。我想函数with可能会有所帮助,但我不知道如何使用它来按行应用函数。

1 个答案:

答案 0 :(得分:4)

正如@DavidArenburg所说,

mat/rowSums(mat)

似乎是最简单的方法。使用1e5元素进行测试;

mat <- matrix(sample(1:100,1e5,replace=TRUE), ncol = 5) 
dim(mat)
[1] 20000     5

library(microbenchmark)    
microbenchmark(a <- mat/rowSums(mat), unit="ms")
# Unit: milliseconds
# expr      min        lq      mean    median      uq      max neval
# *    0.767314 0.7937865 0.8235583 0.8070225 0.81532 2.461567   100

calculateContributions <- function(X){
  return(X/sum(X))
}

microbenchmark(b <- apply(mat, 1, calculateContributions), unit="ms")
# Unit: milliseconds
# expr      min       lq     mean   median       uq      max neval
# *    84.44795 86.19673 89.37455 87.41942 89.72254 164.3082   100

比矩阵划分快100倍。

更糟糕的是,apply调用的结果是转置矩阵(credit:@DavidArenburg),因此您仍需要转换回来。当你这样做时,你会得到与矩阵除法完全相同的结果。

identical(a, t(b))
[1] TRUE

旁注:(我在这里仍然是新人)为什么人们会将有效的答案添加为评论(为什么我会因为归因和额外的详细信息而对这些答案进行投票?)。