我正在获取一个值列表,并尝试使用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)
我的问题是,是否有不同的方法来做到这一点.包中还有其他别名选项,但我没有看到它们的任何示例.一个是"不".也许我应该使用它呢?
我意识到我已经在某种程度上回答了我的问题,但我想知道这是否可以在不必诉诸%>% !.于最后的情况下完成.
您可以使用反引号将结果传递给运算符底层的函数:
> 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)
为什么不把否定移到"前线".这就是你通常否定中%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)
甚至
data.frame(data = c(1:2, NA, 4:5, NA, 7)) %>%
is.na %>%
`n'est pas`
Run Code Online (Sandbox Code Playgroud)