Эффективный способ проверить неравенство между двумя столбцами, учитывающими NA в R? - PullRequest
1 голос
/ 23 апреля 2020

Когда я фильтрую, чтобы проверить неравенство между двумя столбцами, мне нужно четко указать NA в данных, потому что фильтр сохраняет строки, в которых условие оценивается как TRUE, и NA как бы нарушает эту оценку. Вот что я имею в виду:

Возьмите следующие данные:

df <- data.frame(x = c(1:4,NA,6:10), y = c(1,2,NA,3,6,NA,7,8,9,11))
df
    x  y
1   1  1
2   2  2
3   3 NA
4   4  3
5  NA  6
6   6 NA
7   7  7
8   8  8
9   9  9
10 10 11

Когда я хочу узнать, какие строки неравны, следующий код не обрезает их:

library(dplyr)
df %>% filter(x != y)

   x  y
1  4  3
2 10 11

Вместо этого мне нужно четко указать NA:

df %>% filter(x != y | (is.na(x) & !is.na(y)) | (!is.na(x) & is.na(y)))

   x  y
1  3 NA
2  4  3
3 NA  6
4  6 NA
5 10 11

... но это слишком многословно. Я пробовал с другими методами, такими как базовое подмножество и subset, но это неудобство сохраняется.

Итак, есть ли более простой способ проверки неравенства с учетом НС ??

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Сначала отформатируйте их:

df %>% filter(format(x) != format(y))

давая:

   x  y
1  3 NA
2  4  3
3 NA  6
4  6 NA
5 10 11
1 голос
/ 23 апреля 2020

Используя базу R, вы можете сделать это:

df[(df$x!=df$y | is.na(df$x!=df$y)),]
#        x  y
#    3   3 NA
#    4   4  3
#    5  NA  6
#    6   6 NA
#    10 10 11

Необходимо явно включить сравнения, которые дают NA, с помощью is.na()

...