Как поместить данные в R без потери строк NA?
У меня есть некоторые данные, которые я просматриваю в R. Один конкретный столбец под названием "Высота" содержит несколько строк NA.
Я ищу подмножество моего фрейма данных, чтобы все высоты выше определенного значения были исключены из моего анализа.
df2 <- subset ( df1 , Height < 40 )
Однако всякий раз, когда я делаю это, R автоматически удаляет все строки, которые содержат значения NA для высоты. Я не хочу это. Я попытался в том числе аргументы для na.rm
f1 <- function ( x , na.rm = FALSE ) {
df2 <- subset ( x , Height < 40 )
}
f1 ( df1 , na.rm = FALSE )
но это, похоже, ничего не делает; строки с NA по-прежнему исчезают из моего фрейма данных. Есть ли способ подмножества моих данных как таковых, без потери строк NA?
2 ответа
Если мы решим использовать 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)),]
Для подмножества по символьным / факторным переменным вы можете использовать %in%
хранить NA
с. Укажите данные, которые вы хотите исключить.
# Create Dataset
library(data.table)
df=data.table(V1=c('Surface','Bottom',NA),V2=1:3)
df
# V1 V2
# 1: Surface 1
# 2: Bottom 2
# 3: <NA> 3
# Keep all but 'Bottom'
df[!V1 %in% c('Bottom')]
# V1 V2
# 1: Surface 1
# 2: <NA> 3
Это работает, потому что %in%
никогда не возвращает NA
(видеть ?match
)