web-dev-qa-db-fra.com

Comment obtenir les n premières entreprises d’un bloc de données par ordre décroissant

J'essaie d'obtenir les meilleures entreprises à partir d'un bloc de données. Voici mon code ci-dessous.

data("Forbes2000", package = "HSAUR")
sort(Forbes2000$profits,decreasing=TRUE)

J'aimerais maintenant obtenir les 50 premières observations de ce vecteur trié.

9
Teja

head et tail sont des fonctions vraiment utiles!

head(sort(Forbes2000$profits,decreasing=TRUE), n = 50)

Si vous voulez les 50 premières lignes de data.frame, vous pouvez utiliser la fonction arrange de plyr pour trier le data.frame, puis utiliser head.

library(plyr)

head(arrange(Forbes2000,desc(profits)), n = 50)

Notez que j’ai enveloppé profits dans un appel à desc, ce qui signifie qu’il sera trié par ordre décroissant.

Travailler sans plyr

head(Forbes2000[order(Forbes2000$profits, decreasing= T),], n = 50)
24
mnel

Utilisez order pour trier le data.frame, puis head pour n’obtenir que les 50 premières lignes.

data("Forbes2000", package = "HSAUR")
head(Forbes2000[order(Forbes2000$profits, decreasing=TRUE), ], 50)
9
GSee

Vous pouvez utiliser rank à partir de dplyr.

    library(dplyr)
    top_fifty <- Forbes2000 %>%
         filter(rank(desc(profits))<=50)

Ceci trie vos données par ordre décroissant et ne conserve que les valeurs dont le rang est inférieur ou égal à 50 (c'est-à-dire les 50 meilleurs).
Dplyr est très utile. Les commandes et la syntaxe de chaînage sont très faciles à comprendre. 10/10 recommanderais.

3
Vince

Mnel a raison de dire qu'en général, vous souhaitez utiliser les fonctions head () et tail () avec une fonction de tri. Je devrais mentionner cependant pour les ensembles de données de taille moyenne, la méthode de Vince fonctionne plus rapidement. Si vous n'avez pas utilisé head () ou tail (), vous pouvez utiliser l'opérateur d'appel de sous-section de base [] ....

 library(plyr)
 x = arrange(Forbes2000,desc(profits))
 x = x[1:50,]
 #Or using Order
 x = Forbes2000[order(Forbes2000$profits, decreasing= T),]
 x = x[1:50,]

Cependant, je recommande vraiment les fonctions head (), tail () ou filter (), car l'opérateur [] habituel suppose que vos données sont structurées dans un tableau ou un format de matrice facile à dessiner. (Il faut espérer que cela répond à la question Teja)

Maintenant, quel emballage vous choisissez est en grande partie subjective. Cependant, en lisant les commentaires des gens, je dirai que le choix d'utiliser les fonctions arrange (), order () de {bases} de plyr avec {utils} head () et tails, ou plyr () dépend largement de la taille de la mémoire et de la taille de la ligne votre jeu de données. Je pourrais expliquer plus en détail comment Plyr et parfois Dplyr ont des problèmes avec de grands ensembles de données complexes, mais je ne veux pas sortir du sujet.

P.S. C’est l’une des premières fois que je réponds, alors vos commentaires sont les bienvenus.

1
mlane