Lors de l'utilisation summarise
de plyr
la ddply
fonction avec, les catégories vides sont supprimées par défaut. Vous pouvez modifier ce comportement en ajoutant .drop = FALSE
. Cependant, cela ne fonctionne pas lors de l'utilisation summarise
avec dplyr
. Existe-t-il un autre moyen de conserver des catégories vides dans le résultat?
Voici un exemple avec de fausses données.
library(dplyr)
df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
# Now add an extra level to df$b that has no corresponding value in df$a
df$b = factor(df$b, levels=1:3)
# Summarise with plyr, keeping categories with a count of zero
plyr::ddply(df, "b", summarise, count_a=length(a), .drop=FALSE)
b count_a
1 1 6
2 2 6
3 3 0
# Now try it with dplyr
df %.%
group_by(b) %.%
summarise(count_a=length(a), .drop=FALSE)
b count_a .drop
1 1 6 FALSE
2 2 6 FALSE
Pas exactement ce que j'espérais. Existe-t-il une dplyr
méthode pour obtenir le même résultat que .drop=FALSE
dans plyr
?
Réponses:
Depuis que dplyr 0.8 a
group_by
gagné l'.drop
argument qui fait exactement ce que vous avez demandé:Une note supplémentaire pour aller avec la réponse de @ Moody_Mudskipper: L'utilisation
.drop=FALSE
peut donner des résultats potentiellement inattendus lorsqu'une ou plusieurs variables de regroupement ne sont pas codées en tant que facteurs. Voir les exemples ci-dessous:la source
count
:iris %>% count(Species, group2, .drop=FALSE)
Le problème est toujours ouvert, mais en attendant, d'autant plus que vos données sont déjà prises en compte, vous pouvez utiliser à
complete
partir de "tidyr" pour obtenir ce que vous recherchez:Si vous souhaitez que la valeur de remplacement soit égale à zéro, vous devez le spécifier avec
fill
:la source
ungroup()
avant de terminer. Si jamais vous remarquezcomplete
ne pas avoir terminé,ungroup
c'est probablement nécessaire.complete(variablewithdroppedlevels, nesting(var1,var2,var3))
(c'est en fait dans l'aide carcomplete
il m'a encore fallu un certain temps pour comprendresolution dplyr:
Faire d'abord groupé df
puis nous résumons les niveaux qui se produisent en comptant avec
n()
puis nous fusionnons nos résultats dans un bloc de données qui contient tous les niveaux de facteur:
enfin, dans ce cas, puisque nous examinons les nombres, les
NA
valeurs sont changées à 0.Cela peut également être implémenté de manière fonctionnelle, voir les réponses: Ajouter des lignes aux données groupées avec dplyr?
Un hack:
Je pensais que je publierais un terrible hack qui fonctionne dans ce cas pour l'intérêt. Je doute sérieusement que vous deviez jamais faire cela, mais cela montre comment
group_by()
génère les attributs comme s'ildf$b
s'agissait d'un vecteur de caractère et non d'un facteur avec des niveaux. De plus, je ne prétends pas comprendre cela correctement - mais j'espère que cela m'aidera à apprendre - c'est la seule raison pour laquelle je le publie!définir une valeur "hors limites" qui ne peut pas exister dans l'ensemble de données.
modifier les attributs en "truc"
summarise()
:faire le résumé:
indexer et remplacer toutes les occurrences de oob_val
qui donne le prévu:
la source
ce n'est pas exactement ce qui a été demandé dans la question, mais au moins pour cet exemple simple, vous pouvez obtenir le même résultat en utilisant xtabs, par exemple:
en utilisant dplyr:
ou plus court:
résultat (égal dans les deux cas):
la source