r中“!”和“ - ”之间的区别

时间:2016-04-07 11:39:17

标签: r negation

这是一段代码片段,我正在尝试使用!

 demo <- <dataframe>[!which(<dataframe>$<col_name> == 0),]

但它没有给我正确的输出。

当我在-中使用时:

demo <- <dataframe>[-which(<dataframe>$<col_name>== 0),] 
它给了我正确的答案。

有人可以解释为什么会这样吗?

4 个答案:

答案 0 :(得分:4)

因此which将返回满足<dataframe>$<col_name> == 0的行索引向量,而不是逻辑(TRUE / FALSE)向量。因此,当你否定这一点!你胡说八道。您基本上执行此操作!c(0, 1, 2, 3, 4),返回TRUE FALSE FALSE FALSE FALSE

-符号将删除which语句返回的行,这是您想要的。

或者你可以这样做: demo <- <dataframe>[!<dataframe>$<col_name> == 0,]

答案 1 :(得分:4)

我们来看一个矢量示例:

x <- c(1, 10, 30, 5)

我想在此向量中消除10的所有倍数。对应于我的条件的布尔矢量可以像这样计算

b <- x %% 10 == 0

如果我执行which(b),这将返回与TRUE中的b值对应的索引,因此要排除10的倍数的所有值,我可以

x[ -which(b) ]

但是如果我在!上使用which(b)(否定运算符)而不是-(命令将变为x[!which(b)]),结果将完全错误,那就是因为否定运算符可以应用于整数而不返回错误:如果整数等于0,它将返回TRUE,如果整数不等于0,它将返回FALSE(尝试{{1} })。

因此,如果我希望使用!(-2:2)得到正确的结果,我需要将其直接应用于布尔值的载体

!

答案 2 :(得分:1)

which返回一个索引,可用于对data.frame(或其他任何东西)进行正/负索引。但!位置向量只会返回FALSE s。试试!5。以下是一些例子:

df <- data.frame(col1=1:6, col2=rep(0:1, 3))
> df
  col1 col2
1    1    0
2    2    1
3    3    0
4    4    1
5    5    0
6    6    1

# an vector of positions
> which(df$col2 == 0)
[1] 1 3 5

# ! this vector
> !which(df$col2 == 0)
[1] FALSE FALSE FALSE

# - this vector
> -which(df$col2 == 0)
[1] -1 -3 -5

答案 3 :(得分:1)

因为返回了什么:

> !which(x = mtcars$cyl == 4)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

> -which(x = mtcars$cyl == 4)
 [1]  -3  -8  -9 -18 -19 -20 -21 -26 -27 -28 -32

值得注意的是:

identical(mtcars[!mtcars$cyl == 4, ],
+         mtcars[mtcars$cyl != 4, ])
[1] TRUE