Ich möchte einen gruppierten Filter so erstellen dplyr
, dass innerhalb jeder Gruppe nur die Zeile zurückgegeben wird, die den Mindestwert der Variablen hat x
.
Mein Problem ist: Wie erwartet werden bei mehreren Minima alle Zeilen mit dem Mindestwert zurückgegeben. In meinem Fall möchte ich die erste Zeile jedoch nur, wenn mehrere Minima vorhanden sind.
Hier ist ein Beispiel:
df <- data.frame(
A=c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
x=c(1, 1, 2, 2, 3, 4, 5, 5, 5),
y=rnorm(9)
)
library(dplyr)
df.g <- group_by(df, A)
filter(df.g, x == min(x))
Wie erwartet werden alle Minima zurückgegeben:
Source: local data frame [6 x 3]
Groups: A
A x y
1 A 1 -1.04584335
2 A 1 0.97949399
3 B 2 0.79600971
4 C 5 -0.08655151
5 C 5 0.16649962
6 C 5 -0.05948012
Mit ddply hätte ich die Aufgabe folgendermaßen angegangen:
library(plyr)
ddply(df, .(A), function(z) {
z[z$x == min(z$x), ][1, ]
})
... was funktioniert:
A x y
1 A 1 -1.04584335
2 B 2 0.79600971
3 C 5 -0.08655151
F: Gibt es eine Möglichkeit, dies in dplyr anzugehen? (Aus Geschwindigkeitsgründen)
filter(df.g, rank(x) == 1)
?