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

11

我正在使用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

当我在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

我的问题是是否有其他方法可以做到这一点。包中有其他别名选项,但我没有看到它们的任何示例。其中之一是“not”。也许我应该使用那个?

我意识到我在某种程度上已经回答了自己的问题,但我想知道是否可以在不必在结尾处使用%>% !.的情况下完成此操作。

3个回答

7
您可以使用反引号将结果输出到操作符的基础函数中:
> 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

2
好的。那很有道理。那样做也可以,我还用not替换了\!\,也可以。这解释了别名的目的。 - Mark Danese
是的,not 被定义为 function (x) .Primitive("!"),这等同于调用 ! 运算符下层的函数。 - jdharrison
1
我也考虑过添加...而不是别名,使其更具表现力 ;) - Stefan
我喜欢这个答案,因为它既将运算符留在你“期望”阅读它的位置,又展示了如何将运算符与 magrittr 管道运算符分离。 - Carl Witthoft
这两个答案都很好。如果可以的话,我会接受两个答案。 - Mark Danese

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

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

没错,更简洁。我喜欢两个答案,但这个最干净。 - Mark Danese
1
如果否定是链中所需的最后一个操作,则此方法有效。 - jdharrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接