Quand je cherchais récemment une fonction R renvoyant les index des N premiers nombres max / min dans un vecteur donné, j'ai été surpris qu'il n'y ait pas une telle fonction.
Et c'est quelque chose de très similaire.
La solution de force brute utilisant la fonction base :: order semble être la plus simple.
topMaxUsingFullSort <- function(x, N) {
sort(x, decreasing = TRUE)[1:min(N, length(x))]
}
Mais ce n'est pas le plus rapide au cas où votre valeur N serait relativement petite par rapport à la longueur du vecteur x .
De l'autre côté, si le N est vraiment petit, vous pouvez utiliser la fonction base :: whichMax de manière itérative et à chaque itération, vous pouvez remplacer la valeur trouvée par -Inf
# the input vector 'x' must not contain -Inf value
topMaxUsingWhichMax <- function(x, N) {
vals <- c()
for(i in 1:min(N, length(x))) {
idx <- which.max(x)
vals <- c(vals, x[idx]) # copy-on-modify (this is not an issue because idxs is relative small vector)
x[idx] <- -Inf # copy-on-modify (this is the issue because data vector could be huge)
}
vals
}
Je crois que vous voyez le problème - la nature de copie sur modification de R. Donc, cela fonctionnera mieux pour très très très petit N (1, 2, 3) mais il ralentira rapidement pour des valeurs de N plus grandes. Et vous itérez sur tous les éléments en vecteur x N fois.
Je pense que la meilleure solution dans clean R est d'utiliser partial base :: sort .
topMaxUsingPartialSort <- function(x, N) {
N <- min(N, length(x))
x[x >= -sort(-x, partial=N)[N]][1:N]
}
Ensuite, vous pouvez sélectionner le dernier ( N ème) élément du résultat des fonctions définies ci-dessus.
Remarque: les fonctions définies ci-dessus ne sont que des exemples - si vous souhaitez les utiliser, vous devez vérifier les entrées / sanity (par exemple N> longueur (x) ).
J'ai écrit un petit article sur quelque chose de très similaire (obtenir les index des N meilleures valeurs max / min d'un vecteur) sur http://palusga.cz/?p=18 - vous pouvez trouver ici quelques repères de fonctions similaires que j'ai définies ci-dessus.
topn
fonction qui est plus rapide quesort
,order
etnth
. Regardez la documentation.