问题 如何在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 = 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

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

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


8000
2017-08-17 00:27


起源



答案:


为什么不把否定移到“前线”。这就是你通常否定的方式 %in% 中缀operatiuon

 !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

5
2017-08-17 00:58



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


答案:


为什么不把否定移到“前线”。这就是你通常否定的方式 %in% 中缀operatiuon

 !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

5
2017-08-17 00:58



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


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

> 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

5
2017-08-17 00:29



好。这就说得通了。这工作,我也取代了 `!`有 not 这也有效。这解释了别名的目的。 - Mark Danese
是 not 被定义为 function (x) .Primitive("!") 这与调用底层函数相同 ! 运营商。 - jdharrison
我也考虑过添加...而不是别名让它真正具有表现力;) - Stefan
我喜欢这个答案,因为它将操作员留在你“期望”读取它的位置,因为它显示了如何将操作员与操作员分开 magrittr 管道运营商。 - Carl Witthoft
这两个答案都很好。如果可以,我会接受两者。 - Mark Danese


甚至

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

4
2017-11-24 09:49