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 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
因为返回的内容:
> !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 ]
这是一个代码片段,我在其中尝试使用 !
:
demo <- <dataframe>[!which(<dataframe>$<col_name> == 0),]
但它没有给我正确的输出。
当我使用 -
时:
demo <- <dataframe>[-which(<dataframe>$<col_name>== 0),]
它帮我找到了正确答案。
谁能解释一下为什么会这样?
which
returns 是一个索引,可用于 positive/negatively 索引 data.frame
(或其他任何内容)。但是 !
位置向量只会 return 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
因为返回的内容:
> !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 ]