Zeilen entfernen, die mit allen oder einigen NAs (fehlende Werte) in den Daten.Rahmen
Möchte ich entfernen Sie die Zeilen in diesem data-frame:
a) enthalten NA
s über alle Spalten. Unten ist meine Beispiel-Daten-frame.
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA NA
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA NA NA
4 ENSG00000207604 0 NA NA 1 2
5 ENSG00000207431 0 NA NA NA NA
6 ENSG00000221312 0 1 2 3 2
Grundsätzlich, würde ich mag, um einen Daten-frame, wie die folgenden.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) enthalten NA
s nur in einigen Spalten, also kann ich auch bekommen dieses Ergebnis:
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie auch
abgeschlossen.Fällen
:na.omit
ist schöner, nur entfernen Sie alleNA
's.complete.cases
teilweise erlaubt die Auswahl, indem nur bestimmte Spalten der dataframe:Deine Lösung nicht funktionieren kann. Wenn Sie darauf bestehen, mit
is.na
, dann haben Sie etwas zu tun wie:aber mit
complete.cases
ist sehr viel klarer und schneller.final[complete.cases(final),]
?complete.cases
? Wenn ich wollte zu halten, die Zeilen mit NAs, anstatt zu verwerfen?final[ ! complete.cases(final),]
kooperieren nicht...final[complete.cases(final[ , 5:6]), 5:6]
oder vielleicht sinnvollerfinal[complete.cases(final[ , 5:6]), c(1,5:6)]
; man kann auch auswählen, indem Sie den Namen zBselected.names <- c("gene", "rnor", "cfam"); final[complete.cases(final[ , selected.names]), selected.names]
(Wahrscheinlich nicht nützlich für Sie, nicht mehr, aber vielleicht für die vielen Anfänger die dies Lesen Q)final
ist dataframe variable?final[ !complete.cases(final), ]
auf version 3.5.1 und es funktioniert: halten Sie alle Zeilen, die eine oder mehrere NAs.Versuchen
na.omit(your.data.frame)
. Zur zweiten Frage, posten Sie es als eine andere Frage (für Klarheit).rownames(x) <- NULL
.na.omit()
Tropfen ZeilenNA
in jeder Spaltetidyr
hat eine neue Funktiondrop_na
:drop_na
. Zum Beispieldf %>% drop_na()
,df %>% na.omit()
unddrop_na(df)
sind im Grunde alle gleichwertig.na.omit
fügt zusätzliche Infos wie die Indizes weggelassen Fällen und - noch wichtiger - wird nicht zulassen, Sie Spalten auswählen - dies ist, wodrop_na
scheint.na.omit
mit oder ohne Rohre, nur so können Siedrop_na
mit oder ohne Rohre.Ich bevorzuge folgenden Weg, um zu überprüfen, ob die Zeilen enthalten alle NAs:
Zurück logischer Vektor mit Werten, die angibt, ob es eine NA in einer Reihe. Sie können es verwenden, um zu sehen, wie viele Zeilen müssen Sie drop:
und schließlich fallen Sie
Für das filtern von Zeilen mit bestimmten Teil des NAs wird es ein wenig schwieriger (zum Beispiel, können Sie füttern 'final[,5:6]' zu 'gelten').
In der Regel, Joris Meys' Lösung zu sein scheint mehr elegant.
rowSum(!is.na(final))
scheint besser geeignet alsapply()
Weitere option, wenn Sie möchten mehr Kontrolle darüber, wie die Zeilen werden als ungültig ist
Unter Verwendung der oben, diese:
Wird:
...wo nur Zeile 5 entfernt wird, denn es ist die einzige Zeile, in der NAs für beide
rnor
UNDcfam
. Die Boolesche Logik kann dann geändert werden, um fit spezifischen Anforderungen.Wenn Sie wollen Kontrolle darüber, wie viele NAs sind gültig für jede Zeile, versuchen Sie diese Funktion. Für viele Umfrage-Daten-sets, zu viele leere Frage Antworten kann ruinieren die Ergebnisse. Damit Sie gelöscht werden, nachdem eine bestimmte Schwelle überschreitet. Diese Funktion ermöglicht Ihnen, zu entscheiden, wie viele NAs die Zeile haben kann, bevor es gelöscht:
Standardmäßig, wird es zu beseitigen alle NAs:
Oder geben Sie die maximale Anzahl von NAs erlaubt:
Wenn die Leistung eine Priorität ist, verwenden Sie
data.table
undna.omit()
mit optionaler paramcols=
.na.weglassen.Daten.table
ist der Schnellste auf meinem benchmark (siehe unten), ob alle Spalten oder Spalten auswählen (OP-Frage Teil 2).Wenn Sie nicht möchten, zu verwenden
data.table
verwendencomplete.cases()
.Auf einem Vanille
data.frame
,abgeschlossen.Fällen
ist schneller alsna.weglassen()
oderdplyr::drop_na()
. Beachten Sie, dassna.omit.data.frame
nicht unterstützencols=
.Benchmark-Ergebnis
Hier ist ein Vergleich der Basis (blau),
dplyr
(rosa), unddata.table
(gelb) Methoden zum löschen, entweder alle oder wählen Sie fehlen Beobachtungen, die auf fiktive Datensatz mit 1 million Beobachtungen von 20 numerische Variablen mit unabhängigen 5% Wahrscheinlichkeit des seins fehlt, und die eine Teilmenge von 4 Variablen, die für Teil 2.Ihre Ergebnisse können variieren je nach Länge, Breite und sparsity von Ihr bestimmten Datensatz.
Hinweis-log-Skala der y-Achse.
Benchmark-Skript
Mit dplyr-package können wir filter NA, wie folgt:
Das liefert die Zeilen, die mindestens EIN nicht NA-Wert.
Das liefert die Zeilen, die mindestens ZWEI nicht-NA-Wert.
Für Ihre erste Frage, ich habe einen code, die ich bin bequem mit, um loszuwerden, alle NAs. Danke, @Gregor um es einfacher zu machen.
Für die zweite Frage, der code ist nur ein Wechsel von der bisherigen Lösung.
Beachten Sie die -5 ist die Anzahl der Spalten in Ihren Daten. Dadurch wird verhindert, dass Zeilen mit allen NAs, da die rowSums fügt bis zu 5 und Sie werden Nullen nach der Subtraktion. Dieses mal, da.logisch notwendig ist.
Können wir auch die subset-Funktion für diese.
Diese geben nur die Zeilen, die nicht mit NA in beiden mmul und rnor
Ich bin ein synthesizer -:). Hier kombinierte ich die Antworten in einer Funktion:
Vorausgesetzt
dat
als Ihre dataframe, die erwartete Leistung erreicht werden kann, mit1.
rowSums
2.
lapply
Oben genannten Funktion löscht alle Zeilen aus der Daten-frame, der hat 'NA' in jeder Spalte und gibt die resultierenden Daten. Wenn Sie wollen, überprüfen Sie, ob mehrere Werte wie
NA
und?
änderndart=c('NA')
in der Funktion param zudart=c('NA', '?')
Meine Vermutung ist, dass dies eher elegant gelöst
NA
. Ich glaube, was der OP will, ist:df %>% filter_all(all_vars(!is.na(.)))
Einen Ansatz, der sowohl die Allgemeinen und die Erträge sind relativ lesbaren code zu verwenden, der
filter
- Funktion und Ihre Varianten im dplyr-package (filter_all
,filter_at
,filter_if
):