Czy jest możliwe filtrowanie data.frame dla pełnych przypadków przy użyciu dplyr? complete.cases
oczywiście z listą wszystkich zmiennych. Ale to jest a) rozwlekłe, gdy jest dużo zmiennych ib) niemożliwe, gdy nazwy zmiennych nie są znane (np. W funkcji przetwarzającej dowolną ramkę data.frame).
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
nie tylko akceptuje wektory. Zajmuje również całe ramki danych.dplyr
funkcji filtrującej. Wydaje mi się, że nie byłem wystarczająco jasny i zaktualizowałem moje pytanie.Odpowiedzi:
Spróbuj tego:
albo to:
albo to:
Jeśli chcesz filtrować na podstawie braków jednej zmiennej, użyj warunku:
lub
Inne odpowiedzi wskazują, że z powyższych rozwiązań
na.omit
jest znacznie wolniejszy, ale należy to zrównoważyć faktem, że zwraca indeksy wierszy pominiętych wna.action
atrybucie, podczas gdy inne powyższe rozwiązania nie.DODANE Zaktualizowano, aby odzwierciedlić najnowszą wersję dplyr i komentarzy.
DODANE Zaktualizowano, aby odzwierciedlić najnowszą wersję tidyr i komentarzy.
źródło
na.omit()
działa dość słabo, ale ta jest szybka.df %>% filter(complete.cases(.))
. Nie jestem pewien, czy ostatnie zmiany w dplyr umożliwiły to.drop_na
, więc można teraz zrobić:df %>% drop_na()
.To działa dla mnie:
Lub trochę bardziej ogólnie:
Miałoby to tę zaletę, że dane mogły zostać zmodyfikowane w łańcuchu przed przekazaniem ich do filtra.
Kolejny test porównawczy z większą liczbą kolumn:
źródło
df %>% slice(which(complete.cases(.)))
działa ~ 20% szybciej niż podejście z filtrem w powyższym teście porównawczym.%>% data.frame() %>%
przed próbą i przefiltrować na complete.cases (.), Ponieważ nie będzie on działać na lub coś w tym stylu. A przynajmniej takie było moje doświadczenie.Oto kilka wyników testów porównawczych odpowiedzi Grothendiecka. na.omit () zajmuje 20 razy więcej czasu niż pozostałe dwa rozwiązania. Myślę, że byłoby miło, gdyby dplyr miał do tego funkcję, może jako część filtra.
źródło
Jest to krótka funkcja, która pozwala określić kolumny (w zasadzie wszystko, co
dplyr::select
może zrozumieć), które nie powinny mieć żadnych wartości NA (wzorowane na pandas df.dropna () ):[ drop_na jest teraz częścią tidyr : powyższe można zastąpić
library("tidyr")
]Przykłady:
źródło
Spróbuj tego
ALBO nawet to
Powyższe polecenia dbają o sprawdzenie kompletności wszystkich kolumn (zmiennych) w data.frame.
źródło
dplyr
w ramach funkcji filtru. Pozwoliłoby to na zgrabną integrację w łańcuchach dplyr itp.dplyr:::do.data.frame
oświadczeniuenv$. <- .data
dodaje kropkę do środowiska. Brak takiego stwierdzenia w magrittr :: "%>%" ``Ze względu na kompletność,
dplyr::filter
można całkowicie uniknąć, ale nadal można tworzyć łańcuchy za pomocąmagrittr:extract
(aliasu[
):Dodatkowym bonusem jest szybkość, jest to najszybsza metoda spośród wariantów
filter
ina.omit
(przetestowana przy użyciu mikroprocesorów @Miha Trošt).źródło
extract()
jest prawie dziesięć razy wolniejsze niżfilter()
. Jednak gdy tworzę mniejszą ramkę danych za pomocądf <- df[1:100, 1:10]
, obraz zmienia się iextract()
jest najszybszy.magrittr::extract
to, że najszybszy sposób tylkon <= 5e3
w benchmarku Miha Trošt.