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