【问题标题】:find the index of top n elements in a vector in order [R]按 [R] 顺序查找向量中前 n 个元素的索引
【发布时间】:2016-10-27 19:07:54
【问题描述】:

我有一个数字类型的矩阵,大小为 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

我只能找到this question,它解释了如何查找前 n 个元素,但不是按值的顺序。

【问题讨论】:

    标签: r sorting indexing


    【解决方案1】:

    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() 函数,然后为每个值取前五个值,因为您指定的是行而不是列,所以转置了结果。

    【讨论】:

      【解决方案2】:

      这也可以用data.tablemelting之后变成'long'格式,按'Var1'分组,我们得到'value'的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
      

      【讨论】:

      • 两者都有效,但这些都比 Richard Scriven 建议的答案慢。基本 R 解决方案需要多花大约 20% 的时间,而 data.table 一则需要多花 80% 的时间。感谢您的建议。
      • @ViragSwami 感谢您的来信。我认为data.table 会很快。可能,melt(来自 reshape2)增加了时间。
      猜你喜欢
      • 2017-04-15
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2021-07-17
      相关资源
      最近更新 更多