如何将逻辑运算符(!)与R中的magrittr一起使用

如何将逻辑运算符(!)与R中的magrittr一起使用,r,magrittr,R,Magrittr,我正在使用magrittr获取一个值列表,并试图找到那些不是NA的值。下面是一个简单的例子: 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 当我输入not运算符时在is.na前面,我得到一个错误: data.frame(data =

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

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
当我输入not运算符时
is.na
前面,我得到一个错误:

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

FUN中的错误(左、右):只能对数字、逻辑或复杂类型进行操作

经过多次试验,我偶然发现了一个有效的方法:

 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
我的问题是,是否有不同的方法来做到这一点。包中还有其他别名选项,但我没有看到它们的任何示例。一个是“不是”。也许我应该用它来代替


我意识到我已经在某种程度上回答了我的问题,但我想知道这是否可以不必求助于
%>%结尾。

您可以使用反勾号将结果导入操作符下面的函数:

> 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
或者使用
否定功能:

> 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

为什么不把否定移到“前面”呢。这就是您通常在%
中缀运算中否定
%的方式

 !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
甚至

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

好啊这是有道理的。这很管用,我还替换了
`
`与
一起使用,这同样有效。这就解释了别名的用途。Yes
not
被定义为
函数(x)。Primitive(!”
,它与调用
下面的函数相同运算符。我还考虑添加…而不是作为别名,以使其真正具有表现力;)我喜欢这个答案,因为它将操作符放在您“期望”阅读它的位置,并且因为它显示了如何将操作符从
magrittr
管道操作符中分离出来。这两个答案都很好。如果可以的话,我会接受这两种。更短的我喜欢这两个答案,但这是最干净的。如果否定是链中所需的最后一个操作,则此方法有效。