2012-06-29 11 views
70

Ich möchte wissen, wie NA Werte in einem Datenrahmen zu verzichten, aber nur in einigen Spalten Ich bin interessiert.auslassen Reihen bestimmte Spalte von NA enthält

Zum Beispiel

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

aber ich nur wollen die Daten wegzulassen, wo y ist NA, daher sollte das Ergebnis sein

x y z 
1 1 0 NA 
2 2 10 33 

na.omit löschen scheint alle Zeilen con tain irgendein NA.

Kann mir jemand aus dieser einfachen Frage helfen?

Aber wenn jetzt ändere ich die Frage 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 x=na oder z=na weglassen will, wo kann ich die | in Funktion setzen?

Antwort

44

Sie konnten die complete.cases Funktion verwenden und es in eine Funktion setzen so:

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 

EDIT:Nur Rück Reihen mit nicht NA s

Wenn Sie alle Zeilen eliminieren wollen mit mindestens einem NA in jeder Spalte, verwenden Sie einfach die complete.cases Funktion gerade nach oben:

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

Oder wenn completeFun bereits tief verwurzelt in Ihren Workflow;)

completeFun(DF, names(DF)) 
+0

Können Sie Ihren Ansatz gierig machen? Nimm alle Spalten, die keine NAs haben. –

+1

Du meinst nur Rückkehr * Zeilen * ohne 'NA's? Wie 'completeFun (DF, Namen (DF))'? – BenBarnes

+0

Richtig! Bitte überlegen Sie, ob Sie es zu Ihrer Antwort hinzufügen möchten, da dies hier ein häufiges Bedürfnis ist. - - Ich denke, Mnels Antwort kann nicht so ausgedehnt werden wie deine. Ihr Funktionsansatz ist großartig! –

133

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),] 
+0

Wie Sie diesen Ansatz anwenden Gierig für alle Spalten in dem Datensatz? Wenn einer der Spaltenwerte ein NA-Übersprung ist. Ihre Datensatzausgabe ist also nur die zweite Spalte. –

3

Try this:

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

Use 'Teilmenge'

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

Hadleys tidyr gerade diese erstaunliche Funktion drop_na

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