R 查找给定列中最常包含最大值的行

R 查找给定列中最常包含最大值的行,r,matrix,R,Matrix,为一个可能不太理想的标题道歉——我似乎想不出更好的了 假设我有一个3x5矩阵,如下所示: test.df <- matrix(rep(1:5, 3), nrow = 3) test.df [,1] [,2] [,3] [,4] [,5] [1,] 1 4 2 5 3 [2,] 2 5 3 1 4 [3,] 3 1 4 2 5 首先,我将which.max应用于每一列: apply(test

为一个可能不太理想的标题道歉——我似乎想不出更好的了

假设我有一个3x5矩阵,如下所示:

test.df <- matrix(rep(1:5, 3), nrow = 3)
test.df
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    2    5    3
[2,]    2    5    3    1    4
[3,]    3    1    4    2    5
首先,我将
which.max
应用于每一列:

apply(test.df, 2, which.max)
[1] 3 2 3 1 3
然后我将
table
应用于结果向量,并获得给定行被发现具有最大值的次数的计数

table(
    apply(test.df, 2, which.max)
)
1 2 3 
1 1 3 
最后,我再次使用
which.max
来获取最多次具有最大值的行的索引

不幸的是,我需要对大约20000个矩阵执行上述操作,其中一些矩阵可能包含数千行。因此,我想知道是否有一个更快和/或更优雅的解决方案。最好是利用R中矩阵运算的能力


非常感谢

此使用
行和的解决方案似乎提供了相当好的加速:

test.df <- matrix(rep(1:5, 3), nrow = 3)

original = function(m) {
    which.max(
        table(
            apply(m, 2, which.max)
        )
    )
}

row_sums = function(m) {
    which.max(rowSums(apply(m, 2, function(x) {x == max(x)})))
}

library(microbenchmark)

microbenchmark(original(test.df), row_sums(test.df))

通过在基本R中使用
max.col
,可以避免在列上循环(即
apply
):

which.max(table(max.col(t(test.df))))

运行基准测试是一个好主意,但是对于这样一个很小的矩阵,结果不可靠/不具信息性。在我的初始测试中,我确实将它增加到了100行,并且它似乎可以保持,但是增加到10000+时,它似乎会比原来的慢。谢谢Marius。我自己也想过,但不是这样。这是一个相当快的速度。至少1000行左右。非常感谢。在我简短的基准测试中,我发现OP的方法速度最快,然后是我的(现在已删除),然后是Marius',数据大小约为100k行和100列或
which.max(tablate(max.col(t(test.df)))
谢谢你的建议!根据1000x15矩阵上的基准测试,这种方法比原始版本或Marius建议的改进运行得更快。我也喜欢
列表
建议。不幸的是,table函数只报告它看到的情况。因此,代码必须更加混乱,以确保返回正确的索引。
Unit: microseconds
              expr    min      lq      mean median     uq      max neval
 original(test.df) 86.725 91.6320 107.19399 92.513 94.462 1376.445   100
 row_sums(test.df) 26.698 28.0895  54.30694 29.741 32.443 2378.536   100
which.max(table(max.col(t(test.df))))