Entfernen Sie Zeilen mit NAs (fehlende Werte) in data.frame
Möchte ich entfernen Sie die Zeilen in diesem data-frame 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
Auch, würde ich gerne wissen, wie man filter nur für einige Spalten, so habe ich auch noch einen Daten-frame, wie dies:
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
InformationsquelleAutor der Frage Benoit B. | 2011-02-01
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.InformationsquelleAutor der Antwort Joris Meys
Versuchen
na.omit(your.data.frame)
. Zur zweiten Frage, posten Sie es als eine andere Frage (für Klarheit).InformationsquelleAutor der Antwort Roman Luštrik
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]' , 'übernehmen').
In der Regel, Joris Meys' Lösung zu sein scheint mehr elegant.
InformationsquelleAutor der Antwort donshikin
Wenn Sie wie Rohre (
%>%
),tidyr
's neuedrop_na
ist dein Freund:InformationsquelleAutor der Antwort lukeA
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.InformationsquelleAutor der Antwort getting-there
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:
InformationsquelleAutor der Antwort Pierre Lafortune
Das liefert die Zeilen, die mindestens EIN nicht NA-Wert.
Das liefert die Zeilen, die mindestens ZWEI nicht-NA-Wert.
InformationsquelleAutor der Antwort Leo
Können wir auch die subset-Funktion für diese.
Diese geben nur die Zeilen, die nicht mit NA in beiden mmul und rnor
InformationsquelleAutor der Antwort Ramya Ural
Mit dplyr-package können wir filter NA, wie folgt:
InformationsquelleAutor der Antwort Raminsu
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.
InformationsquelleAutor der Antwort LegitMe
Ich bin ein synthesizer -:). Hier kombinierte ich die Antworten in einer Funktion:
InformationsquelleAutor der Antwort Jerry T
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
InformationsquelleAutor der Antwort C8H10N4O2
Vorausgesetzt
dat
als Ihre dataframe, die erwartete Leistung erreicht werden kann, mit1.
rowSums
2.
lapply
InformationsquelleAutor der Antwort Prradep
Oben genannten Funktion löscht alle Zeilen aus dem data frame, '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', '?')
InformationsquelleAutor der Antwort sapy
Meine Vermutung ist, dass dies eher elegant gelöst
InformationsquelleAutor der Antwort Joni Hoppen