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

Difference between " ! " and " - " in r

这是一个代码片段,我在其中尝试使用 !:

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

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

当我使用 - 时:

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

它帮我找到了正确答案。

谁能解释一下为什么会这样?

which returns 是一个索引,可用于 positive/negatively 索引 data.frame(或其他任何内容)。但是 ! 位置向量只会 return FALSEs。尝试 !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

因为返回的内容:

> !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

因此 which 将 return 满足 <dataframe>$<col_name> == 0 的行索引向量,而不是逻辑 (TRUE/FALSE) 向量。因此,当你用 !你胡说八道。你实际上是在做这个 !c(0, 1, 2, 3, 4) which returns TRUE FALSE FALSE FALSE FALSE.

- 符号将删除 return 由 which 语句编辑的行,这正是您想要的。

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

我们举一个向量的例子:

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

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

b <- x %% 10 == 0

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

x[ -which(b) ]

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

因此,如果我想通过使用 ! 得到正确的结果,我需要直接将它应用于布尔值向量

x[ !b ]