Mam problemy z ramki danych i nie można było rozwiązać tę kwestię sobie: dataframe ma arbitralnych właściwości jak kolumny i każdy wiersz reprezentuje jeden zestaw danych .
Pytanie brzmi:
jak pozbyć się kolumn, w których dla WSZYSTKICH wierszy wartością jest NA ?
Dwa dotychczas oferowane podejścia zawodzą w przypadku dużych zestawów danych, ponieważ (między innymi problemami z pamięcią), które tworzą
is.na(df)
, który będzie obiektem tego samego rozmiaru codf
.Oto dwa podejścia, które są bardziej wydajne pod względem pamięci i czasu
Podejście wykorzystujące
Filter
i podejście wykorzystujące data.table (dla ogólnego czasu i wydajności pamięci)
przykłady wykorzystujące duże dane (30 kolumn, 1e6 wierszy)
źródło
data.frame
Ale możesz zrobić to samo . Nie ma tu niczego, co naprawdę potrzebujedata.table
. Kluczem jest tenlapply
, który pozwala uniknąć kopiowania całego obiektu wykonanego przezis.na(df)
. +10 za wskazanie tego.bd1 <- bd[, unlist(lapply(bd, function(x), !all(is.na(x))))]
,
pofunction(x)
- dzięki za przykład btwdplyr
teraz maselect_if
czasownik, który może być tutaj pomocny:źródło
dplyr
rozwiązania. Nie zawiodłem się. Dzięki!Innym sposobem byłoby użycie
apply()
funkcji.Jeśli masz plik data.frame
następnie możesz użyć,
apply()
aby zobaczyć, które kolumny spełniają twój warunek, dzięki czemu możesz po prostu wykonać to samo podzbiór, co w odpowiedzi Musy, tylko zapply
podejściem.źródło
Spóźniony do gry, ale możesz też skorzystać z
janitor
pakietu. Ta funkcja usunie kolumny, które są wszystkie na NA, i można ją zmienić, aby usunąć również wiersze, które są również NA.df <- janitor::remove_empty(df, which = "cols")
źródło
źródło
Zaakceptowana odpowiedź nie działa w przypadku kolumn nienumerycznych. Na podstawie tej odpowiedzi poniższe działa z kolumnami zawierającymi różne typy danych
źródło
Inne opcje z
purrr
pakietem:źródło
Mam nadzieję, że to też może pomóc. Można go przekształcić w jedno polecenie, ale łatwiej było mi go czytać, dzieląc go na dwa polecenia. Wykonałem funkcję zgodnie z poniższą instrukcją i działałem błyskawicznie.
naColsRemoval = function (DataTable) { na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )] DataTable [ , unlist (na.cols) := NULL , with = F] }
.SD pozwoli ograniczyć weryfikację do części tabeli, jeśli chcesz, ale zajmie całą tabelę jako
źródło
Przydatną
base R
opcją może byćcolMeans()
:źródło
Możesz skorzystać z pakietu Janitor
remove_empty
Również inne podejście do dostawcy
LUB
jest to również przydatne, jeśli chcesz wykluczyć / zachować tylko kolumnę z pewną liczbą brakujących wartości, np
źródło