簡體   English   中英

按[R]順序找到向量中前n個元素的索引

[英]find the index of top n elements in a vector in order [R]

我有一個數字類型的矩陣,昏暗的10000 *50。現在,我想按值的順序在每行中找到前5個元素的索引。 例如,一個樣本可能看起來像:

set.seed(2)
v1 <- matrix(runif(20 , 0 ,20 ) , 2 ,10)
v1
#          [,1]      [,2]     [,3]     [,4]     [,5]      [,6]      [,7]      [,8]      [,9]    [,10]
#[1,]  3.697645 11.466527 18.87679  2.58318  9.36037 11.053481 15.210266  8.105644 19.527970 8.896185
#[2,] 14.047481  3.361038 18.86950 16.66898 10.99967  4.777895  3.616402 17.070969  4.516509 1.499588

然后我希望輸出看起來像:

#[1,]    9    3    7    2    6
#[2,]    3    8    4    1    5

我只能找到這個問題 ,它說明了如何找到前n個元素,但沒有按值的順序。

apply()非常適合矩陣上的按行運算。 你可以做

t(apply(v1, 1, function(x) order(-x)[1:5]))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    9    3    7    2    6
# [2,]    3    8    4    1    5

這會沿矩陣v1逐行運行order()函數,然后為每個v1獲取前五個值,因為您指定的是行而不是列,所以會轉置結果。

這也可以用做data.tablemelting成“長”格式,通過“VAR1”分組,我們得到的order “價值”

library(reshape2)
library(data.table)
setDT(melt(v1))[, head(order(-value),5), Var1]
#    Var1 V1
#1:    1  9
#2:    1  3
#3:    1  7
#4:    1  2
#5:    1  6
#6:    2  3
#7:    2  8
#8:    2  4
#9:    2  1
#10:   2  5

或使用base R

ave(-v1, row(v1), FUN = order)[,1:5]
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    9    3    7    2    6
#[2,]    3    8    4    1    5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM