在 dplyr 管道 `%>%` 中否定 `!`

Negation `!` in a dplyr pipeline `%>%`

是否可以在 dplyr 管道中使用否定?

例如

df = data.frame(a = c(T,F,F), b = c(T,T,T))

我会写

!df

但是我不会写

df %>% !

(因为 ! 不是函数)。

特别是,我经常使用 !is.na,但我无法将其合并到管道中。

请注意,dplyr 中使用的管道运算符是从 magrittr 导入的,因此要访问其他功能,请使用

library(magrittr)

请参阅 ?extact 页面以获取常见的 magrittr 友好别名列表。

在这种情况下 not() 被定义为 !

的别名
df %>% not

为了更容易调用!is.na,您可以定义

not_ <- function(x, f) not(f(x))
df %>% not_(is.na)

您可以在 !

左右使用 backticks
 df %>%
       `!`
 #      a     b
 #[1,] FALSE FALSE
 #[2,]  TRUE FALSE
 #[3,]  TRUE FALSE

对于!is.na

 df$a[2] <- NA
 df %>% 
      is.na %>% 
      `!`
 #       a    b
 #[1,]  TRUE TRUE
 #[2,] FALSE TRUE
 #[3,]  TRUE TRUE