'How to get the positions of the k greatest(or smallest) elements of a vector? [duplicate]

I have a vector and I want to find the indices of the k greatest elements, not the elements themselves which I could do with sort. One idea would be to add indices to the values and have a custom sort function that only compares the first elements of pairs (a classical solution to this problem) but surely there has to be a simpler way ? Note that performance isn`t a matter.

r


Solution 1:[1]

First I create a random vector:

vector <- c(1, 3, 6, 2, 7, 8, 10, 4)

Next, you can use the following code which will output the top k elements as x with index ix:

k <- 3

lst <- sort(vector, index.return=TRUE, decreasing=TRUE)
lapply(lst, `[`, lst$x %in% head(unique(lst$x),k))

Output:

$x
[1] 10  8  7

$ix
[1] 7 6 5

As you can see ix gives the index of the top k elements.

Solution 2:[2]

Using rank.

x <- c(1, 3, 6, 2, 7, 8, 10, 4)

seq_along(x)[rank(-x) < 4]
# [1] 5 6 7

If you have ties, the result is this:

x <- c(10, 3, 6, 2, 7, 8, 10, 4)

seq_along(x)[rank(-x) < 4]
# [1] 1 6 7

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Quinten
Solution 2 jay.sf