R-获取向量中最多n个元素的索引的最快方法

用户名

假设我有一个x包含100万个元素的巨大向量,并且我想找到最多30个元素的索引。我并不特别在意结果是否在这30个元素之间排序,只要它们是整个向量中的最大值30个即可。使用order[x][1:30]似乎很昂贵,因为它必须对整个向量进行排序。我曾考虑过利用中的partial选项sort,但会sort返回值,并且在指定index.return时不支持选项partial有没有找到索引而不对整个向量进行排序的有效方法?

斯吉布

我想使用sort的partial参数和添加一种混合方法which

whichpart <- function(x, n=30) {
  nx <- length(x)
  p <- nx-n
  xp <- sort(x, partial=p)[p]
  which(x > xp)
}

一些基准测试:

library("microbenchmark")
library("data.table")
library("compiler")

set.seed(123)
x <- rnorm(1e6)
y <- sample.int(1e6)


whichpart <- function(x, n=30) {
  nx <- length(x)
  p <- nx-n
  xp <- sort(x, partial=p)[p]
  which(x > xp)
}

cpwhichpart <- cmpfun(whichpart)

# using quicksort
quicksort <- function(x, n=30) {
  sort(x, method="quick", decreasing=TRUE, index.return=TRUE)$ix[1:n]
}

cpquicksort <- cmpfun(quicksort)

# @Mariam
whichsort <- function(x, n=30) {
  which(x >= sort(x, decreasing=TRUE)[30], arr.ind=TRUE)
}

cpwhichsort <- cmpfun(whichsort)

# @Ferdinand.kraft
top <- function(x, n=30) {
    result <- numeric()
    for(i in 1:n){
        j <- which.max(x)
        result[i] <- j
        x[j] <- -Inf
    }
    result
}

cptop <- cmpfun(top)

# @Tony Breyal
dtable <- function(x, n=30) {
  dt <- data.table(x=x, x.index=seq.int(x))
  setkey(dt, "x")
  dt$x.index[1:n]
}

cpdtable <- cmpfun(dtable)

# @Roland
roland <- cmpfun(function(x, n=30) {
  y <- rep(-Inf, n)
  for (i in seq_along(x)) {
    if (x[i] > y[1]) {
      y[1] <- x[i]
      y <- y[order(y)]
    }
  }
  y
})

## rnorm
microbenchmark(whichpart(x), cpwhichpart(x),
               quicksort(x), cpquicksort(x),
               whichsort(x), cpwhichsort(x),
               top(x), cptop(x),
               dtable(x), cpdtable(x),
               roland(x), times=10)

# Unit: milliseconds
#            expr        min         lq     median         uq        max neval
#    whichpart(x)   45.63544   46.05638   47.09077   49.68452   51.42065    10
#  cpwhichpart(x)   45.65996   45.77212   47.02808   48.07482   82.20458    10
#    quicksort(x)  100.90936  103.00783  105.17506  109.31784  139.83518    10
#  cpquicksort(x)  100.53958  102.78017  107.64470  138.96630  142.52882    10
#    whichsort(x)  148.86010  151.04350  155.80871  159.47063  184.56697    10
#  cpwhichsort(x)  149.05578  150.21183  151.36918  166.58342  173.87567    10
#          top(x)  146.10757  182.42089  184.53050  191.37293  193.62272    10
#        cptop(x)  155.14354  179.14847  184.52323  196.80644  220.21222    10
#       dtable(x) 1041.32457 1042.54904 1049.26096 1065.40606 1080.89969    10
#     cpdtable(x) 1042.08247 1043.54915 1051.76366 1084.14360 1310.26485    10
#       roland(x)  251.42885  261.47608  273.20838  295.09733  323.96257    10

## integer
microbenchmark(whichpart(y), cpwhichpart(y),
               quicksort(y), cpquicksort(y),
               whichsort(y), cpwhichsort(y),
               top(y), cptop(y),
               dtable(y), cpdtable(y),
               roland(y), times=10)

# Unit: milliseconds
#            expr       min        lq    median        uq       max neval
#    whichpart(y)  11.60703  11.76857  12.03704  12.52871  47.88526    10
#  cpwhichpart(y)  11.62885  11.75006  12.53724  13.88563  46.93677    10
#    quicksort(y)  88.14924  89.47630  92.42414 103.53439 137.44335    10
#  cpquicksort(y)  88.11544  89.15334  92.63420  94.42244 133.78006    10
#    whichsort(y) 122.34675 123.13634 124.91990 127.79134 131.43400    10
#  cpwhichsort(y) 121.85618 122.91653 125.45211 127.14112 158.61535    10
#          top(y) 163.06669 181.19004 211.11557 224.19237 239.63139    10
#        cptop(y) 163.37903 173.55113 209.46770 218.59685 226.81545    10
#       dtable(y) 499.50807 505.45513 514.55338 537.84129 604.86454    10
#     cpdtable(y) 491.70016 498.62664 525.05342 527.14666 580.19429    10
#       roland(y) 235.44664 237.52200 242.87925 268.34080 287.71196    10


identical(sort(quicksort(x)), whichpart(x))
# [1] TRUE

编辑:测试@flodel的建议

# @flodel
whichpartrev <- function(x, n=30) {
  which(x >= -sort(-x, partial=n)[n])
}

microbenchmark(whichpart(x), whichpartrev(x), times=100)

# Unit: milliseconds
#             expr      min       lq   median       uq      max neval
#     whichpart(x) 45.44940 46.15011 46.51321 48.67986 80.63286   100
#  whichpartrev(x) 28.84482 31.30661 32.87695 62.37843 67.84757   100

microbenchmark(whichpart(y), whichpartrev(y), times=100)

# Unit: milliseconds
#             expr      min       lq   median       uq      max neval
#     whichpart(y) 11.56135 12.26539 13.05729 13.75199 43.78484   100
#  whichpartrev(y) 16.00612 16.73690 17.71687 19.04153 49.02842   100

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R:获取向量中每个唯一值的第一个和最后一个位置的最快方法?

来自分类Dev

在R中获取向量中每个元素的一个实例的函数

来自分类Dev

R-从矩阵中获取向量中最大值的位置

来自分类Dev

如何从R中的数组获取向量

来自分类Dev

根据R中的列表中给定的索引提取向量的元素

来自分类Dev

R:获取向量中大于变量但针对整个列的第一实例索引

来自分类Dev

R:获取向量中大于变量但针对整个列的第一实例索引

来自分类Dev

R中的向量列表-提取向量的元素

来自分类Dev

获取R中向量中重复值的第一个元素的索引

来自分类Dev

MATLAB-获取向量中的每N个元素

来自分类Dev

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

来自分类Dev

从R中的n对中提取k个不同元素的最快方法

来自分类Dev

获取R向量中重复邻居元素的索引

来自分类Dev

获取向量中点之间的最大距离(R)

来自分类Dev

如何从R中for循环的迭代结果获取向量?

来自分类Dev

寻找最快的方法来获取向量中相同元素之间的所有间隔

来自分类Dev

如何为另一个向量中的每个元素获取向量中最接近的元素而不重复?

来自分类Dev

如何为另一个向量中的每个元素获取向量中最接近的元素而不重复?

来自分类Dev

获取整个列的data.frame列内的向量的第n个元素-R

来自分类Dev

获取整个列的data.frame列内的向量的第n个元素-R

来自分类Dev

在R中,从每组n个元素的向量中获取最小值

来自分类Dev

获取向量中整数频率的最快方法是什么?

来自分类Dev

获取向量中每个运行的最后一个元素的索引

来自分类Dev

R:每个元素最多限制5个

来自分类Dev

R应用于向量列表;提取向量元素以在函数中使用

来自分类Dev

如何为每个元素获取mxn矩阵中最接近的r个元素

来自分类Dev

如何使用组合中给定元素的索引获取向量?

来自分类Dev

如何使用组合中给定元素的索引获取向量?

来自分类Dev

如何使用指针算法获取向量中元素的索引?

Related 相关文章

  1. 1

    R:获取向量中每个唯一值的第一个和最后一个位置的最快方法?

  2. 2

    在R中获取向量中每个元素的一个实例的函数

  3. 3

    R-从矩阵中获取向量中最大值的位置

  4. 4

    如何从R中的数组获取向量

  5. 5

    根据R中的列表中给定的索引提取向量的元素

  6. 6

    R:获取向量中大于变量但针对整个列的第一实例索引

  7. 7

    R:获取向量中大于变量但针对整个列的第一实例索引

  8. 8

    R中的向量列表-提取向量的元素

  9. 9

    获取R中向量中重复值的第一个元素的索引

  10. 10

    MATLAB-获取向量中的每N个元素

  11. 11

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

  12. 12

    从R中的n对中提取k个不同元素的最快方法

  13. 13

    获取R向量中重复邻居元素的索引

  14. 14

    获取向量中点之间的最大距离(R)

  15. 15

    如何从R中for循环的迭代结果获取向量?

  16. 16

    寻找最快的方法来获取向量中相同元素之间的所有间隔

  17. 17

    如何为另一个向量中的每个元素获取向量中最接近的元素而不重复?

  18. 18

    如何为另一个向量中的每个元素获取向量中最接近的元素而不重复?

  19. 19

    获取整个列的data.frame列内的向量的第n个元素-R

  20. 20

    获取整个列的data.frame列内的向量的第n个元素-R

  21. 21

    在R中,从每组n个元素的向量中获取最小值

  22. 22

    获取向量中整数频率的最快方法是什么?

  23. 23

    获取向量中每个运行的最后一个元素的索引

  24. 24

    R:每个元素最多限制5个

  25. 25

    R应用于向量列表;提取向量元素以在函数中使用

  26. 26

    如何为每个元素获取mxn矩阵中最接近的r个元素

  27. 27

    如何使用组合中给定元素的索引获取向量?

  28. 28

    如何使用组合中给定元素的索引获取向量?

  29. 29

    如何使用指针算法获取向量中元素的索引?

热门标签

归档