这是一段代码片段,我正在尝试使用!
:
demo <- <dataframe>[!which(<dataframe>$<col_name> == 0),]
但它没有给我正确的输出。
当我在-
中使用时:
demo <- <dataframe>[-which(<dataframe>$<col_name>== 0),]
它给了我正确的答案。
有人可以解释为什么会这样吗?
答案 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