如何在R中使用带有magrittr的逻辑运算符(!)

Mar*_*ese 11 r magrittr

我正在获取一个值列表,并尝试使用magrittr找到那些不是NA的值.这是一个简单的例子:

data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% is.na
Run Code Online (Sandbox Code Playgroud)

这会产生正确的结果:

      data
[1,] FALSE
[2,] FALSE
[3,]  TRUE
[4,] FALSE
[5,] FALSE
[6,]  TRUE
[7,] FALSE
Run Code Online (Sandbox Code Playgroud)

当我把not运算符!放在前面时is.na,我收到一个错误:

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

给我

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
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有不同的方法来做到这一点.包中还有其他别名选项,但我没有看到它们的任何示例.一个是"不".也许我应该使用它呢?

我意识到我已经在某种程度上回答了我的问题,但我想知道这是否可以在不必诉诸%>% !.于最后的情况下完成.

jdh*_*son 6

您可以使用反引号将结果传递给运算符底层的函数:

> 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
Run Code Online (Sandbox Code Playgroud)

或者使用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
Run Code Online (Sandbox Code Playgroud)

  • 好。那讲得通。那行得通,我还用`not`代替了\\!这就解释了别名的目的。 (2认同)

42-*_*42- 5

为什么不把否定移到"前线".这就是你通常否定中%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
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 5

甚至

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