Как использовать логический оператор (!) С magrittr в R

Я беру список значений и пытаюсь найти те, которые не являются NA, используя magrittr. Вот простой пример:

data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% is.na

который дает правильный результат:

      data
[1,] FALSE
[2,] FALSE
[3,]  TRUE
[4,] FALSE
[5,] FALSE
[6,]  TRUE
[7,] FALSE

Когда я помещаю оператор ! не перед is.na, я получаю сообщение об ошибке:

data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% !is.na

дает мне

Error in FUN(left, right) : operations are possible only for numeric, logical or complex types

После многих испытаний я наткнулся на это, которое работает:

 data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% is.na %>% !.

      data
[1,]  TRUE
[2,]  TRUE
[3,] FALSE
[4,]  TRUE
[5,]  TRUE
[6,] FALSE
[7,]  TRUE

Мой вопрос в том, есть ли другой способ сделать это. В пакете есть другие варианты псевдонимов, но я не вижу их. Один - "нет". Может быть, я должен использовать это вместо этого?

Я понимаю, что в какой-то степени я ответил на свой вопрос, но я хотел бы знать, можно ли это сделать без необходимости прибегать к %>% !. в конце.

Ответ 1

Почему бы просто не переместить отрицание на "фронт". Вот как вы обычно отрицаете операцию инфикса %in%

 !data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% is.na

      data
[1,]  TRUE
[2,]  TRUE
[3,] FALSE
[4,]  TRUE
[5,]  TRUE
[6,] FALSE
[7,]  TRUE

Ответ 2

Вы можете использовать обратные выходы, чтобы передать результат в функцию, лежащую в основе оператора:

> data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% is.na %>% `!`
      data
[1,]  TRUE
[2,]  TRUE
[3,] FALSE
[4,]  TRUE
[5,]  TRUE
[6,] FALSE
[7,]  TRUE

В качестве альтернативы используйте функцию Negate:

> data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% Negate(is.na)()
      data
[1,]  TRUE
[2,]  TRUE
[3,] FALSE
[4,]  TRUE
[5,]  TRUE
[6,] FALSE
[7,]  TRUE

Ответ 3

Или даже

data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% 
  is.na %>% 
 `n'est pas`