В Matrix.utils
теперь есть агрегатная функция. Это позволяет достичь желаемого с помощью одной строки кода и примерно в 10 раз быстрее, чем решение combineByRow
, и в 100 раз быстрее, чем решение by
:
N <- 10000
m <- matrix( runif(N*100), nrow=N)
rownames(m) <- sample(1:(N/2),N,replace=T)
> microbenchmark(a<-t(sapply(by(m,rownames(m),colSums),identity)),b<-combineByRow(m),c<-aggregate.Matrix(m,row.names(m)),times = 10)
Unit: milliseconds
expr min lq mean median uq max neval
a <- t(sapply(by(m, rownames(m), colSums), identity)) 6000.26552 6173.70391 6660.19820 6419.07778 7093.25002 7723.61642 10
b <- combineByRow(m) 634.96542 689.54724 759.87833 732.37424 866.22673 923.15491 10
c <- aggregate.Matrix(m, row.names(m)) 42.26674 44.60195 53.62292 48.59943 67.40071 70.40842 10
> identical(as.vector(a),as.vector(c))
[1] TRUE
РЕДАКТИРОВАТЬ: Фрэнк прав, rowms несколько быстрее, чем любое из этих решений. Вы хотели бы рассмотреть возможность использования другой из этих других функций, только если вы использовали Matrix
, особенно разреженную, или если вы выполняли агрегацию помимо sum
.