Extrakt Zeile entsprechenden minimalen Wert einer Variablen, der durch die Gruppe
Möchte ich (1) - Gruppe-Daten von einer variable (State
), (2) innerhalb jeder Gruppe finden, die die Reihe von minimum-Wert der anderen variable (Employees
), und (3) extrahieren Sie die gesamte Zeile.
(1) und (2) sind einfache Einzeiler, und ich fühle mich wie (3) sollten das auch sein, aber ich kann es nicht bekommen.
Hier ist ein Beispiel-Datensatz:
> data
State Company Employees
1 AK A 82
2 AK B 104
3 AK C 37
4 AK D 24
5 RI E 19
6 RI F 118
7 RI G 88
8 RI H 42
data <- structure(list(State = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), .Label = c("AK", "RI"), class = "factor"), Company = structure(1:8, .Label = c("A",
"B", "C", "D", "E", "F", "G", "H"), class = "factor"), Employees = c(82L,
104L, 37L, 24L, 19L, 118L, 88L, 42L)), .Names = c("State", "Company",
"Employees"), class = "data.frame", row.names = c(NA, -8L))
Berechnen min
von der Gruppe ist einfach, mit aggregate
:
> aggregate(Employees ~ State, data, function(x) min(x))
State Employees
1 AK 24
2 RI 19
...oder data.table
:
> library(data.table)
> DT <- data.table(data)
> DT[ , list(Employees = min(Employees)), by = State]
State Employees
1: AK 24
2: RI 19
Aber wie extrahiere ich die gesamte Zeile entsprechend min
Werte, also auch Company
im Ergebnis?
InformationsquelleAutor Ed Swindelles | 2014-06-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas eleganter:
Geringfügig weniger elegant als mit
.SD
, aber ein bisschen schneller (für Daten mit vielen Gruppen):Auch, nur ersetzen Sie den Ausdruck
which.min(Employees)
mitEmployees == min(Employees)
wenn ein Daten-set hat mehrere identische min-Werte, und Sie möchten Teilmenge alle von Ihnen.Siehe auch Teilmenge von Gruppe mit Daten.Tabelle.
InformationsquelleAutor Señor O
Einen
dplyr
Lösung :InformationsquelleAutor agstudy
Als dies ist die Google-top-Treffer, ich dachte, ich möchte hinzufügen, einige zusätzliche Optionen, die ich nützlich finde zu wissen. Die Idee ist grundsätzlich zu vereinbaren, sobald durch
Employees
und dann nur die uniques proState
Entweder mit
data.table
Alternativ könnten wir auch die erste Bestellung und dann Teilmenge
.SD
. Diese beiden Operationen optimiert wurden in den letzten Daten.Tabelle Versionen undorder
ist scheinbar löstdata.table:::forderv
, während.SD[1L]
löstGforce
Oder
dplyr
Andere interessante Idee entlehnt @Khashaas genial Antwort (mit einer kleinen Modifikation in form von
mult = "first"
um mehrere übereinstimmungen) ist zunächst die Suche nach minimum pro Gruppe und führen Sie dann eine binäre Verknüpfung zurück. Der Vorteil hierbei ist sowohl die Nutzung der Daten.Tabellengmin
- Funktion (die überspringt die Auswertung overhead) und die binäre join FunktionEinige benchmarks
data.table
obwohl.Aktualisiert.
InformationsquelleAutor David Arenburg
Die Basis-Funktion
by
ist oft nützlich für die Arbeit mit block-Daten in Daten.frames. Zum BeispielTut es die Daten zurück, die in einer Liste, aber Sie kann zusammenbrechen, mit
InformationsquelleAutor MrFlick