R语言 矩阵中最高值的位置

pbgvytdp  于 2023-06-03  发布在  其他
关注(0)|答案(4)|浏览(220)

假设我们有一个像这样的matrix

# Set seed
  set.seed(12345)
# Generate data.frame  
  df <- matrix(sample(1:100,100), nrow = 10)

我想获取第一个n最高值所在的行和列
我知道使用which(df == max(df), arr.ind=TRUE)我可以得到我想要的,但只能得到最高的值。
假设我们想要矩阵中最高的5个值的位置。根据前面的答案,我尝试了which(aux %in% sort(df, decreasing=T)[1:5], arr.ind = TRUE),但它不起作用。
我还知道,使用order(df, decreasing=T)和调制的结果,我可以得到我正在寻找的行和列。不过,我认为这应该是最快的方法。
提前谢谢你的帮助

w51jfk4q

w51jfk4q1#

可以使用match()arrayInd()

vals <- head(sort(df, decreasing = TRUE), 5)

cbind(vals, arrayInd(match(vals, df), dim(df), useNames = TRUE))

     vals row col
[1,]  100   8   3
[2,]   99   9   9
[3,]   98   4   8
[4,]   97   7   9
[5,]   96   3   2
6ojccjat

6ojccjat2#

可以使用quantile

which(df >= quantile(df, 1 - 5/length(df)), arr.ind=TRUE)
#     row col
#[1,]   3   2
#[2,]   8   3
#[3,]   4   8
#[4,]   7   9
#[5,]   9   9

在存在相同值的情况下,结果不需要是5。

i <- which(df >= quantile(df, 1 - 5/length(df)))
arrayInd(i[order(df[i], decreasing = TRUE)][1:5], dim(df))
#     [,1] [,2]
#[1,]    8    3
#[2,]    9    9
#[3,]    4    8
#[4,]    7    9
#[5,]    3    2

也许使用tdigest可以加快分位数的搜索速度。
或者使用orderhead,并使用%%%/%

. <- head(order(df, decreasing = TRUE), 5) - 1
cbind(. %% dim(df)[[1]], . %/% dim(df)[[1]]) + 1
#     [,1] [,2]
#[1,]    8    3
#[2,]    9    9
#[3,]    4    8
#[4,]    7    9
#[5,]    3    2

或者用arrayInd变换索引。

arrayInd(head(order(df, decreasing = TRUE), 5), dim(df))
#     [,1] [,2]
#[1,]    8    3
#[2,]    9    9
#[3,]    4    8
#[4,]    7    9
#[5,]    3    2

也许使用一些外部库可以帮助加速它,比如collapse::radixorderv

. <- head(collapse::radixorderv(df, decreasing = TRUE), 5) - 1
cbind(. %% dim(df)[[1]], . %/% dim(df)[[1]]) + 1
jei2mxaa

jei2mxaa3#

你的方法很有效。只是在使用which之前应该转换为二维数组:

which(array(df %in% tail(sort(df), 5), dim(df)), TRUE)

     row col
[1,]   3   2
[2,]   8   3
[3,]   4   8
[4,]   7   9
[5,]   9   9
apeeds0o

apeeds0o4#

带有expand.grid + order的基本R选项

> expand.grid(lapply(dim(df), seq))[order(-c(df)), ][1:5, ]
   Var1 Var2
28    8    3
89    9    9
74    4    8
87    7    9
13    3    2

下面是data.table版本,其中同时显示了值和索引

library(data.table)

setorder(
    data.table(
        val = c(df),
        CJ(
            col = 1:ncol(df),
            row = 1:nrow(df)
        )
    ), -val
)[1:5]

它给出了

val col row
1: 100   3   8
2:  99   9   9
3:  98   8   4
4:  97   9   7
5:  96   2   3

相关问题