Lassen Sie Zeilen weg, die eine bestimmte Spalte von NA enthalten


129

Ich möchte wissen, wie man NAWerte in einem Datenrahmen weglässt, aber nur in einigen Spalten, die mich interessieren.

Beispielsweise,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

aber ich möchte nur die Daten weglassen, wo yist NA, deshalb sollte das Ergebnis sein

  x  y  z
1 1  0 NA
2 2 10 33

na.omitscheint zu löschen alle Zeilen enthalten keine NA.

Kann mir jemand bei dieser einfachen Frage helfen?

Aber wenn ich jetzt die Frage ändere wie:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA))

Wenn ich nur weglassen möchte x=naoder z=nawo kann ich die |Funktion in setzen?

Antworten:


79

Sie können die complete.casesFunktion folgendermaßen verwenden und in eine Funktion einfügen:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

completeFun(DF, "y")
#   x  y  z
# 1 1  0 NA
# 2 2 10 33

completeFun(DF, c("y", "z"))
#   x  y  z
# 2 2 10 33

BEARBEITEN: Nur Zeilen ohne NAs zurückgeben

Wenn Sie alle Zeilen mit mindestens einer NAin einer Spalte entfernen möchten , verwenden Sie einfach die complete.casesFunktion direkt nach oben:

DF[complete.cases(DF), ]
#   x  y  z
# 2 2 10 33

Oder wenn completeFunbereits in Ihrem Workflow verankert ist;)

completeFun(DF, names(DF))

Können Sie Ihren Ansatz gierig machen? Nehmen Sie alle Spalten, die überhaupt keine NAs haben.
Léo Léopold Hertz 18

1
Du meinst nur Zeilen ohne NAs zurückgeben? Wie completeFun(DF, names(DF))?
BenBarnes

Richtig! Bitte erwägen Sie, es Ihrer Antwort hinzuzufügen, da dies hier häufig vorkommt. - - Ich denke, die Antwort von mnel kann nicht wie Ihre erweitert werden. Ihr Funktionsansatz ist großartig!
Léo Léopold Hertz 18

1
Getan! Danke für den Tipp @ LéoLéopoldHertz Ben
BenBarnes

192

Verwenden is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
DF[!is.na(DF$y),]

1
Wie wenden Sie diesen Ansatz gierig auf alle Spalten im Datensatz an? Wenn einer der Spaltenwerte NA ist, überspringen Sie. Ihre Datensatzausgabe ist also nur die zweite Spalte.
Léo Léopold Hertz 18

2
Verwenden Sie, na.omitum gierig alle Zeilen mit NA in einer beliebigen Spalte zu entfernenna.omit(DF)
M. Viking

68

Hadley hat tidyrgerade diese erstaunliche Funktion bekommendrop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33

30

Verwenden Sie 'Teilmenge'

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))

9

Es ist möglich na.omitfür data.table:

na.omit(data, cols = c("x", "z"))

3
Das cols=Argument ist in der data.table::na.omitBibliothek verfügbar . Nicht die Basis stats::na.omit.
M. Viking

3

Versuche dies:

cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]

2

Zeile weglassen, wenn eine der beiden spezifischen Spalten enthält <NA>.

DF[!is.na(DF$x)&!is.na(DF$z),]

1

Versuchen Sie einfach Folgendes:

DF %>% t %>% na.omit %>% t

Es transponiert den Datenrahmen und lässt Nullzeilen weg, die vor der Transposition 'Spalten' waren, und dann transponieren Sie ihn zurück.


8
Bitte erklären Sie ein wenig, was los ist.
vonbrand
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.