Как поместить данные в 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)

Другие вопросы по тегам