R 查找给定列中最常包含最大值的行
为一个可能不太理想的标题道歉——我似乎想不出更好的了 假设我有一个3x5矩阵,如下所示: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
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))))