Если мы решили использовать функцию subset
, нам нужно следить:
For ordinary vectors, the result is simply ‘x[subset & !is.na(subset)]’.
Таким образом, сохраняются только значения, отличные от NA.
Если вы хотите чтобы сохранить NA
случаи, используйте логические или условия, чтобы сообщить R не отбрасывать NA
случаи:
subset(df1, Height < 40 | is.na(Height))
# or `df1[df1$Height < 40 | is.na(df1$Height), ]`
Не использовать напрямую (будет объяснено в ближайшее время):
df2 <- df1[df1$Height < 40, ]
Пример
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
Причина, по которой последнее не удается, заключается в том, что индексирование с помощью NA
дает NA
. Рассмотрим этот простой пример с вектором:
x <- 1:4
ind <- c(NA, TRUE, NA, FALSE)
x[ind]
# [1] NA 2 NA
Нам нужно как-то заменить те NA
на TRUE
. Самый простой способ - добавить другое «или» условие is.na(ind)
:
x[ind | is.na(ind)]
# [1] 1 2 3
Это именно то, что произойдет в вашей ситуации. Если ваш Height
содержит NA
, тогда логическая операция Height < 40
заканчивается комбинацией TRUE
/ FALSE
/ NA
, поэтому нам нужно заменить NA
на TRUE
, как указано выше.
Вы также можете сделать:
df2 <- df1[(df1$Height < 40 | is.na(df1$Height)),]