R, обратный логическим операторам, возвращающим ничего [дубликат]

yes: :has()

поддержка браузера: none

3
задан 李哲源 6 November 2016 в 06:45
поделиться

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, как указано выше.

7
ответ дан 李哲源 17 August 2018 в 19:08
поделиться

Вы также можете сделать:

df2 <- df1[(df1$Height < 40 | is.na(df1$Height)),]
1
ответ дан dede 17 August 2018 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: