2016-11-06 14 views
3

Ich habe einige Daten, die ich in R ansehe. Eine bestimmte Spalte, mit dem Titel "Höhe", enthält ein paar Zeilen von NA.Wie unterteilen Sie Daten in R ohne NA-Zeilen zu verlieren?

Ich möchte meinen Datenrahmen so unterteilen, dass alle Höhen über einem bestimmten Wert von meiner Analyse ausgeschlossen werden.

df2 <- subset (df1 , Height < 40) 

Immer wenn ich das tue, entfernt R automatisch alle Zeilen, die NA-Werte für Höhe enthalten. Ich will das nicht. Ich habe versucht, einschließlich Argumente für na.rm

f1 <- function (x , na.rm = FALSE) { 
df2 <- subset (x , Height < 40) 
} 
f1 (df1 , na.rm = FALSE) 

, aber das scheint nichts zu tun; Die Zeilen mit NA verschwinden immer noch aus meinem Datenrahmen. Gibt es eine Möglichkeit, meine Daten als solche zu untergliedern, ohne die NA-Zeilen zu verlieren?

+0

Alternativ können wir 'Teilmenge (DF1, Höhe <40 | is.na (Höhe)) verwenden' – Zach

+0

Der Vollständigkeit halber, ähnliche Option 'dplyr' Paket 'filter (df1, Höhe <40 | is.na (Höhe))' –

Antwort

6

Wenn wir subset Funktion verwenden möchten, dann müssen wir aufpassen:

For ordinary vectors, the result is simply ‘x[subset & !is.na(subset)]’. 

Also nur nicht-NA-Werte beibehalten werden.

Wenn Sie NA Fällen behalten möchten, verwenden logische oder Bedingung R zu sagen, nicht NA Fälle fallen:

subset(df1, Height < 40 | is.na(Height)) 
# or `df1[df1$Height < 40 | is.na(df1$Height), ]` 

Sie nicht direkt verwenden (bald erklärt werden):

df2 <- df1[df1$Height < 40, ] 

Beispiel

df1 <- data.frame(Height = c(NA, 2, 4, NA, 50, 60), y = 1:6) 

subset(df1, Height < 40 | is.na(Height)) 

# Height y 
#1  NA 1 
#2  2 2 
#3  4 3 
#4  NA 4 

df1[df1$Height < 40, ] 

# Height y 
#1  NA NA 
#2  2 2 
#3  4 3 
#4  NA NA 

Der Grund dafür, dass letzteres fehlschlägt, ist, dass die Indexierung durch NANA ergibt. Betrachten Sie dieses einfache Beispiel mit einem Vektor:

x <- 1:4 
ind <- c(NA, TRUE, NA, FALSE) 
x[ind] 
# [1] NA 2 NA 

Wir müssen irgendwie jene NA mit TRUE ersetzen. Der einfachste Weg ist, einen anderen „oder“ Bedingung hinzufügen is.na(ind):

x[ind | is.na(ind)] 
# [1] 1 2 3 

Dies ist genau das, was in Ihrer Situation passieren wird. Wenn Ihr HeightNA enthält, dann logische Operation Height < 40 endet eine Mischung aus TRUE/FALSE/NA, also müssen wir, wie oben NA durch TRUE ersetzen.

1

Sie könnten auch tun:

df2 <- df1[(df1$Height < 40 | is.na(df1$Height)),] 
Verwandte Themen