Ich habe einen Datenrahmen und möchte die Anzahl der Zeilen innerhalb jeder Gruppe zählen. Ich benutze die aggregate
Funktion regelmäßig, um Daten wie folgt zu summieren:
df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Jetzt möchte ich Beobachtungen zählen, kann aber anscheinend nicht das richtige Argument dafür finden FUN
. Intuitiv dachte ich, es wäre wie folgt:
df2 <- aggregate(x ~ Year + Month, data = df1, count)
Aber kein solches Glück.
Irgendwelche Ideen?
Einige Spielzeugdaten:
set.seed(2)
df1 <- data.frame(x = 1:20,
Year = sample(2012:2014, 20, replace = TRUE),
Month = sample(month.abb[1:3], 20, replace = TRUE))
nrow
,NROW
,length
...nrow
hat bei mir aber nicht funktioniertNROW
und hat gutlength
funktioniert. +1Antworten:
Aktuelle Best Practice (Tidyverse) ist:
quelle
cbind
die Ergebnisse vonaggregate(Sepal.Length ~ Species, iris, mean)
undaggregate(Sepal.Length ~ Species, iris, length)
df %>% group_by(group, variable) %>% mutate(count = n())
Nach dem Vorschlag von @ Joshua können Sie auf folgende Weise die Anzahl der Beobachtungen in Ihrem
df
Datenrahmen zählen, wobeiYear
= 2007 undMonth
= Nov (vorausgesetzt, es handelt sich um Spalten):und mit
aggregate
folgendem @GregSnow:quelle
dplyr
Paket macht dies mitcount
/tally
Befehlen oder dern()
Funktion :Zunächst einige Daten:
Nun die Zählung:
Wir können auch eine etwas längere Version mit Rohrleitungen und der
n()
Funktion verwenden:oder die
tally
Funktion:quelle
Eine alte Frage ohne
data.table
Lösung. Also los geht's ...Verwenden von
.N
quelle
.()
anstelle von data.table zu verwendenlist()
undsetDT()
zu konvertieren. Also in einem SchrittsetDT(df)[, .N, by = .(year, month)]
.Die einfache Option
aggregate
ist dielength
Funktion, mit der Sie die Länge des Vektors in der Teilmenge angeben können. Manchmal ist es etwas robuster zu bedienenfunction(x) sum( !is.na(x) )
.quelle
Erstellen Sie
Count
für jede Zeile eine neue Variable mit dem Wert 1:Aggregieren Sie dann den Datenrahmen und summieren Sie ihn nach der
Count
Spalte:quelle
aggregate
, es nicht erforderlich ist, jede Variable in "by=
Gefällt mir"list(year=df1$year)
usw. umzubenennen . Adata.frame
ist einelist
bereits soaggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)
wird funktionieren.Eine Alternative zu der
aggregate()
Funktion in diesem Fall wäretable()
mitas.data.frame()
, die auch angibt, welche Kombinationen von Jahr und Monat mit null Vorkommen verbunden sindUnd ohne die null auftretenden Kombinationen
quelle
Wenn Sie 0 Zählungen für Monatsjahre einschließen möchten, die in den Daten fehlen, können Sie ein wenig
table
Magie verwenden.Beispielsweise enthält der Spielzeugdatenrahmen in der Frage df1 keine Beobachtungen vom Januar 2014.
Die Basis-R-
aggregate
Funktion gibt keine Beobachtung für Januar 2014 zurück.Wenn Sie eine Beobachtung dieses Monatsjahres mit 0 als Zählung wünschen, gibt der obige Code einen data.frame mit Zählungen für alle Monat-Jahr-Kombinationen zurück:
quelle
Für meine Aggregationen möchte ich normalerweise den Mittelwert und "wie groß ist diese Gruppe" (auch bekannt als Länge) sehen. Das ist also mein praktischer Ausschnitt für diese Gelegenheiten;
quelle
EIN sqlLösung mit
sqldf
Paket:quelle
In Anbetracht der @ Ben-Antwort würde R einen Fehler auslösen, wenn
df1
keinex
Spalte enthalten ist . Aber es kann elegant gelöst werden mitpaste
:Ebenso kann verallgemeinert werden, wenn bei der Gruppierung mehr als zwei Variablen verwendet werden:
quelle
Sie können
by
Funktionen verwendenby(df1$Year, df1$Month, count)
, um eine Liste der erforderlichen Aggregationen zu erstellen.Die Ausgabe sieht aus wie folgt:
quelle
Es gibt hier bereits viele wundervolle Antworten, aber ich wollte eine weitere Option für diejenigen einfügen, die dem ursprünglichen Datensatz eine neue Spalte hinzufügen möchten, die die Häufigkeit enthält, mit der diese Zeile wiederholt wird.
Das gleiche könnte erreicht werden, indem eine der obigen Antworten mit der
merge()
Funktion kombiniert wird .quelle
Wenn Sie die oben genannten Aggregatlösungen ausprobieren und die folgende Fehlermeldung erhalten:
ungültiger Typ (Liste) für Variable
Versuchen Sie, as.character für die Variablen zu verwenden, da Sie Datums- oder Datums- / Uhrzeitstempel verwenden:
Auf eine oder beide Variablen.
quelle