Ich habe Probleme mit einem Datenrahmen und konnte dieses Problem nicht wirklich selbst lösen:
Der Datenrahmen hat beliebige Eigenschaften als Spalten und jede Zeile repräsentiert einen Datensatz .
Die Frage ist:
Wie werden Spalten entfernt, bei denen für ALLE Zeilen der Wert NA ist ?
Die beiden bisher angebotenen Ansätze scheitern bei großen Datenmengen, da sie (neben anderen Speicherproblemen)
is.na(df)
ein Objekt mit der gleichen Größe wie erstellendf
.Hier sind zwei Ansätze, die speicher- und zeiteffizienter sind
Ein Ansatz mit
Filter
und ein Ansatz unter Verwendung von data.table (für allgemeine Zeit- und Speichereffizienz)
Beispiele mit großen Datenmengen (30 Spalten, 1e6 Zeilen)
quelle
data.frame
. Hier gibt es nichts, was wirklich gebraucht wirddata.table
. Der Schlüssel ist derlapply
, der das Kopieren des gesamten Objekts durch vermeidetis.na(df)
. +10 für den Hinweis.bd1 <- bd[, unlist(lapply(bd, function(x), !all(is.na(x))))]
,
nachfunction(x)
- Danke für das Beispiel btwdplyr
hat jetzt einselect_if
Verb, das hier hilfreich sein kann:quelle
dplyr
Lösung. Wurde nicht enttäuscht. Vielen Dank!Eine andere Möglichkeit wäre, die
apply()
Funktion zu verwenden.Wenn Sie den data.frame haben
Dann können Sie verwenden, um
apply()
zu sehen, welche Spalten Ihre Bedingung erfüllen, und so können Sie einfach dieselbe Teilmenge wie in der Antwort von Musa nur mit einemapply
Ansatz ausführen .quelle
Spät zum Spiel, aber Sie können auch das
janitor
Paket verwenden. Diese Funktion entfernt Spalten, die alle NA sind, und kann geändert werden, um auch Zeilen zu entfernen, die alle NA sind.df <- janitor::remove_empty(df, which = "cols")
quelle
quelle
Die akzeptierte Antwort funktioniert nicht mit nicht numerischen Spalten. Ausgehend von dieser Antwort funktioniert das Folgende mit Spalten, die verschiedene Datentypen enthalten
quelle
Weitere Optionen mit
purrr
Paket:quelle
Ich hoffe das kann auch helfen. Es könnte zu einem einzigen Befehl gemacht werden, aber ich fand es einfacher zu lesen, indem ich es in zwei Befehle aufteilte. Ich machte eine Funktion mit der folgenden Anweisung und arbeitete blitzschnell.
naColsRemoval = function (DataTable) { na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )] DataTable [ , unlist (na.cols) := NULL , with = F] }
Mit .SD können Sie die Überprüfung auf einen Teil der Tabelle beschränken, wenn Sie dies wünschen. Es wird jedoch die gesamte Tabelle als verwendet
quelle
Eine praktische
base R
Option könnte seincolMeans()
:quelle
Sie können das Janitor-Paket verwenden
remove_empty
Auch ein anderer dplyr-Ansatz
ODER
Dies ist auch nützlich, wenn Sie nur Spalten mit einer bestimmten Anzahl fehlender Werte ausschließen / behalten möchten, z
quelle