Ist es möglich, einen data.frame mit dplyr nach vollständigen Fällen zu filtern? complete.cases
mit einer Liste aller Variablen funktioniert natürlich. Dies ist jedoch a) ausführlich, wenn viele Variablen vorhanden sind, und b) unmöglich, wenn die Variablennamen nicht bekannt sind (z. B. in einer Funktion, die einen data.frame verarbeitet).
library(dplyr)
df = data.frame(
x1 = c(1,2,3,NA),
x2 = c(1,2,NA,5)
)
df %.%
filter(complete.cases(x1,x2))
complete.cases
akzeptiert nicht nur Vektoren. Es werden auch ganze Datenrahmen benötigt.dplyr
Filterfunktion. Ich glaube, ich war nicht klar genug und habe meine Frage aktualisiert.Antworten:
Versuche dies:
oder dieses:
oder dieses:
Wenn Sie basierend auf dem Fehlen einer Variablen filtern möchten, verwenden Sie eine Bedingung:
oder
Andere Antworten weisen darauf hin, dass die oben genannten Lösungen
na.omit
viel langsamer sind, dies muss jedoch gegen die Tatsache abgewogen werden, dass Zeilenindizes der ausgelassenen Zeilen in der zurückgegeben werdenna.action
Attribut zurückgegeben werden, während dies bei den anderen oben genannten Lösungen nicht der .HINZUGEFÜGT Aktualisiert, um die neueste Version von dplyr und Kommentare wiederzugeben.
HINZUGEFÜGT Aktualisiert, um die neueste Version von tidyr und Kommentare wiederzugeben.
quelle
na.omit()
funktioniert ziemlich schlecht, aber der ist schnell.df %>% filter(complete.cases(.))
. Ich bin mir nicht sicher, ob die letzten Änderungen in dplyr dies ermöglicht haben.drop_na
, sodass Sie jetzt Folgendes tun können :df %>% drop_na()
.Das funktioniert bei mir:
Oder etwas allgemeiner:
Dies hätte den Vorteil, dass die Daten in der Kette geändert werden könnten, bevor sie an den Filter übergeben werden.
Ein weiterer Benchmark mit mehr Spalten:
quelle
df %>% slice(which(complete.cases(.)))
~ 20% schneller als der Filter-Ansatz in der obigen Benchmark.%>% data.frame() %>%
bevor Sie versuchen, auf complete.cases (.) Zu filtern, da er nicht funktioniert tibbles oder gruppierte tibbles oder so. Zumindest war das die Erfahrung, die ich gemacht habe.Hier sind einige Benchmark-Ergebnisse für Grothendiecks Antwort. na.omit () benötigt 20x so viel Zeit wie die beiden anderen Lösungen. Ich denke, es wäre schön, wenn dplyr eine Funktion dafür hätte, vielleicht als Teil des Filters.
quelle
Dies ist eine kurze Funktion, mit der Sie Spalten angeben können (im Grunde alles, was Sie
dplyr::select
verstehen können), die keine NA-Werte haben sollten (modelliert nach pandas df.dropna () ):[ drop_na ist jetzt Teil von tidyr : das obige kann ersetzt werden durch
library("tidyr")
]Beispiele:
quelle
Versuche dies
ODER auch das
Mit den obigen Befehlen wird die Vollständigkeit aller Spalten (Variablen) in Ihrem data.frame überprüft.
quelle
dplyr
als Teil der Filterfunktion tun . Das würde eine ordentliche Integration in dplyr-Ketten usw. ermöglichendplyr:::do.data.frame
der Anweisung wirdenv$. <- .data
der Umgebung ein Punkt hinzugefügt. Keine solche Aussage in magrittr :: "%>%" `Nur der Vollständigkeit halber
dplyr::filter
kann es insgesamt vermieden werden, aber dennoch in der Lage sein, Ketten zu bilden, indem nurmagrittr:extract
(ein Alias von[
) verwendet wird:Der zusätzliche Bonus ist die Geschwindigkeit. Dies ist die schnellste Methode unter den
filter
undna.omit
-Varianten (getestet mit @Miha Trošt-Mikrobenchmarks).quelle
extract()
fast zehnmal langsamer ist alsfilter()
. Wenn ich jedoch einen kleineren Datenrahmen mit erstelledf <- df[1:100, 1:10]
, ändert sich das Bild undextract()
ist das schnellste.magrittr::extract
als wäre der schnellste Weg nurn <= 5e3
im Miha Trošt Benchmark.