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

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

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

我意识到我已经在一定程度上回答了我的问题,但我想知道是否可以做到这一点而不必%>% !.在最后求助。

4

3 回答 3

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

或者使用以下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
于 2014-08-17T00:29:54.153 回答
5

甚至

data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>% 
  is.na %>% 
 `n'est pas`
于 2014-11-24T09:49:01.870 回答
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
于 2014-08-17T00:58:43.850 回答