Bei Verwendung summarise
mit plyr
der ddply
Funktion 'werden leere Kategorien standardmäßig gelöscht. Sie können dieses Verhalten durch Hinzufügen ändern .drop = FALSE
. Dies funktioniert jedoch nicht bei Verwendung summarise
mit dplyr
. Gibt es eine andere Möglichkeit, leere Kategorien im Ergebnis beizubehalten?
Hier ist ein Beispiel mit gefälschten Daten.
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
Nicht genau das, was ich mir erhofft hatte. Gibt es eine dplyr
Methode, um das gleiche Ergebnis wie .drop=FALSE
in zu erzielen plyr
?
Antworten:
Da dplyr 0.8
group_by
das.drop
Argument gewonnen hat, das genau das tut, wonach Sie gefragt haben:Ein zusätzlicher Hinweis zur Antwort von @ Moody_Mudskipper: Die Verwendung von
.drop=FALSE
kann zu möglicherweise unerwarteten Ergebnissen führen, wenn eine oder mehrere Gruppierungsvariablen nicht als Faktoren codiert sind. Siehe Beispiele unten:quelle
count
:iris %>% count(Species, group2, .drop=FALSE)
Das Problem ist noch offen, aber in der Zwischenzeit, insbesondere da Ihre Daten bereits berücksichtigt sind, können Sie mit
complete
"tidyr" ermitteln, wonach Sie suchen:Wenn Sie möchten, dass der Ersatzwert Null ist, müssen Sie Folgendes angeben mit
fill
:quelle
ungroup()
bevor Sie fertig sind. Wenn Sie jemals bemerken, dass Siecomplete
nicht wirklich fertig sind,ungroup
wird dies wahrscheinlich benötigt.complete(variablewithdroppedlevels, nesting(var1,var2,var3))
(es ist eigentlich in der Hilfe, dasscomplete
ich noch eine Weiledplyr Lösung:
Machen Sie zuerst gruppierte df
dann fassen wir die Ebenen zusammen, die durch Zählen mit auftreten
n()
Dann führen wir unsere Ergebnisse in einem Datenrahmen zusammen, der alle Faktorstufen enthält:
Schließlich werden in diesem Fall die
NA
Werte auf 0 geändert, da wir uns die Anzahl ansehen.Dies kann auch funktional implementiert werden, siehe Antworten: Hinzufügen von Zeilen zu gruppierten Daten mit dplyr?
Ein Hack:
Ich dachte, ich würde einen schrecklichen Hack posten , der in diesem Fall aus Interesse funktioniert. Ich bezweifle ernsthaft, dass Sie dies jemals tun sollten, aber es zeigt, wie
group_by()
die Attribute erzeugt werden, als obdf$b
ein Zeichenvektor kein Faktor mit Ebenen wäre. Ich gebe auch nicht vor, dies richtig zu verstehen - aber ich hoffe, das hilft mir beim Lernen - dies ist der einzige Grund, warum ich es poste!Definieren Sie einen "Out-of-Bound" -Wert, der im Dataset nicht vorhanden sein kann.
Ändern Sie die Attribute in "Trick"
summarise()
:Machen Sie die Zusammenfassung:
indizieren und ersetzen Sie alle Vorkommen von oob_val
was gibt das beabsichtigte:
quelle
Dies ist nicht genau das, was in der Frage gestellt wurde, aber zumindest für dieses einfache Beispiel könnten Sie das gleiche Ergebnis mit xtabs erzielen, zum Beispiel:
mit dplyr:
oder kürzer:
Ergebnis (in beiden Fällen gleich):
quelle