Rang variable par groupe (dplyr)
J'ai un dataframe avec des colonnes x1, x2, group
et je voudrais générer un nouveau dataframe, avec une colonne supplémentaire rank
qui indique l'ordre de x1
dans son groupe.
Il y a une question relative à la ici, mais l'on a accepté la réponse ne semble pas fonctionner.
Jusqu'ici, c'est la fin:
library(dplyr)
data(iris)
by_species <- iris %>%
arrange(Species, Sepal.Length) %>%
group_by(Species)
Mais quand j'essaie d'obtenir le classement en groupe:
by_species <- mutate(by_species, rank=row_number())
L'erreur est:
Erreur dans le rang(x, liens.method = "premier", na.dernière = "garder") :
l'argument "x" est manquant, sans valeur par défaut
Mise à jour
Le problème a été en conflit entre dplyr
et plyr
. Pour reproduire l'erreur de chargement de colis:
library(dplyr)
library(plyr)
data(iris)
by_species <- iris %>%
arrange(Species, Sepal.Length) %>%
group_by(Species) %>%
mutate(rank=row_number())
# Error in rank(x, ties.method = "first", na.last = "keep") :
# argument "x" is missing, with no default
Déchargement plyr
il fonctionne comme il se doit:
detach("package:plyr", unload=TRUE)
by_species <- iris %>%
arrange(Species, Sepal.Length) %>%
group_by(Species) %>%
mutate(rank=row_number())
by_species %>% filter(rank <= 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species rank
## (dbl) (dbl) (dbl) (dbl) (fctr) (int)
## 1 4.3 3.0 1.1 0.1 setosa 1
## 2 4.4 2.9 1.4 0.2 setosa 2
## 3 4.4 3.0 1.3 0.2 setosa 3
## 4 4.9 2.4 3.3 1.0 versicolor 1
## 5 5.0 2.0 3.5 1.0 versicolor 2
## 6 5.0 2.3 3.3 1.0 versicolor 3
## 7 4.9 2.5 4.5 1.7 virginica 1
## 8 5.6 2.8 4.9 2.0 virginica 2
## 9 5.7 2.5 5.0 2.0 virginica 3
Êtes-vous sûr que la commande
hmm non, je ne suis pas sûr... :O
Il ne se plaint pas lorsque j'utilise
Votre post ne pas utiliser
Je pense que j'ai peut-être raté quelque chose aussi 🙂 Si j'utilise
by_species <- mutate(by_species, rank=row_number())
est une production de l'erreur ? Il fonctionne pour moi, et que ton erreur se réfère à la rank
fonction, pas la row_number
fonction qui est utilisée. Aussi, si vous ne l'utilisez rank
, vous devez fournir un argument comme dans rank(x)
(où x
est ce que vous voulez rang). row_number
ne l'exige pas.hmm non, je ne suis pas sûr... :O
Il ne se plaint pas lorsque j'utilise
rank
: by_species <- mutate(by_species, myrank=rank(Sepal.Length))
Votre post ne pas utiliser
rank
(la partie que vous affirmez est à l'origine des problèmes). Si rank
est de travailler pour vous, alors est-ce à dire que ce problème est résolu ou ai-je raté quelque chose ?Je pense que j'ai peut-être raté quelque chose aussi 🙂 Si j'utilise
rank
au lieu de row_number
il ne se plaint pas, mais il ne veut pas faire ce que je veux (rang colonne devrait être comme 1,2,3... 1,2,3.... 1,2,3....)OriginalL'auteur alberto | 2016-01-23
Vous devez vous connecter pour publier un commentaire.
Le suivant donne le résultat souhaité a été spécifié.
dplyr
solution donc je suis en train de monter undata.table
solution dans ce commentaire, il peut être utile. Les éléments suivants à l'aidedata.table
:setDT(iris)[order(Species, Sepal.Length), .SD[1:3], by = Species]
OriginalL'auteur steveb
Pour les futurs lecteurs, le rang par la variable de groupe peut être réalisé à l'aide de la base de R. Par l'OP
iris
exemple de données de rang selonSepal.Length
:OriginalL'auteur Parfait