zusammenführen Wie setze ich Daten in R, ohne NA-Zeilen zu verlieren?




tidyverse subset data frame (2)

Wenn wir uns für die subset Funktion entscheiden, müssen wir Folgendes beachten:

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

Daher werden nur Nicht-NA-Werte beibehalten.

Wenn Sie NA Fälle behalten möchten, verwenden Sie logische oder Bedingung, um R anzuweisen, NA Fälle nicht zu NA :

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

Nicht direkt verwenden (wird noch erklärt):

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, warum letzteres fehlschlägt, ist, dass die Indizierung durch NA 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 diese NA irgendwie durch TRUE ersetzen. Am einfachsten ist es, eine weitere "oder" -Bedingung is.na(ind) : is.na(ind) :

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

Genau das wird in Ihrer Situation passieren. Wenn Ihre Height NA enthält, ergibt die logische Operation Height < 40 eine Mischung aus TRUE / FALSE / NA , daher müssen wir NA wie oben durch TRUE ersetzen.

Ich habe einige Daten, die ich in R betrachte. Eine bestimmte Spalte mit dem Titel "Höhe" enthält einige Zeilen mit NA.

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

df2 <- subset ( df1 , Height < 40 )

Wenn ich dies jedoch tue, entfernt R automatisch alle Zeilen, die NA-Werte für Height enthalten. Ich will das nicht. Ich habe versucht, Argumente für na.rm einzufügen

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 unterteilen, ohne die NA-Zeilen zu verlieren?


Sie könnten auch tun:

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






na