我正在尝试应用一个带矩阵的函数,并将每个元素除以其行的总和。具体来说,我有矩阵
mat <- matrix(1:10, nrow = 2)
我将函数calculateContributions
应用于每一行,如下所示:
apply(mat, 1, calculateContributions)
calculateContributions
函数已定义:
calculateContributions <- function(X){
return(X/sum(X))
}
这给了我需要的结果,但由于apply函数非常慢,我需要多次计算,这个解决方案并不好。我想函数with
可能会有所帮助,但我不知道如何使用它来按行应用函数。
答案 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
旁注:(我在这里仍然是新人)为什么人们会将有效的答案添加为评论(为什么我会因为归因和额外的详细信息而对这些答案进行投票?)。