【发布时间】:2013-01-23 19:27:40
【问题描述】:
如果x 不是NA,是否存在== 的等价物,但结果是x != NA?
以下是我想要的,但它很笨重:
mapply(identical, vec1, vec2)
【问题讨论】:
标签: r
如果x 不是NA,是否存在== 的等价物,但结果是x != NA?
以下是我想要的,但它很笨重:
mapply(identical, vec1, vec2)
【问题讨论】:
标签: r
只需将“==”替换为 %in%。
例子:
> df <- data.frame(col1= c("a", "b", NA), col2= 1:3)
> df
col1 col2
1 a 1
2 b 2
3 <NA> 3
> df[df$col1=="a", ]
col1 col2
1 a 1
NA <NA> NA
> df[df$col1%in%"a", ]
col1 col2
1 a 1
> "x"==NA
[1] NA
> "x"%in%NA
[1] FALSE
【讨论】:
mapply 来识别vec1 的每个元素是否等于vec2 的相应元素。
1 == NA 返回一个逻辑 NA 而不是 TRUE 或 FALSE。如果你想调用NAFALSE,你可以添加第二个条件:
set.seed(1)
x <- 1:10
x[4] <- NA
y <- sample(1:10, 10)
x <= y
# [1] TRUE TRUE TRUE NA FALSE TRUE TRUE FALSE TRUE FALSE
x <= y & !is.na(x)
# [1] TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE
您还可以使用第二个处理步骤将所有 NA 值从相等测试转换为 FALSE。
foo <- x <= y
foo[is.na(foo)] <- FALSE
foo
# [1] TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE
此外,NA == NA 和 NA != NA 一样返回 NA。
【讨论】:
NA 以一种特殊的方式表现(NULL 也是如此)出于非常重要的原因!
== 的行为很有价值,但我希望有一个操作员==' 也能按照我的意愿行事。 (R 不允许用户定义的运算符,对吧?)
'%==%' <- function(a, b) a<=b & !is.na(a); x %==% y。您还可以定义自己的类并在其上创建方法,以便您的类的 == 可以按照您的意愿行事 see here
NA & FALSE 会评估为 FALSE 而不是 NA?这似乎是完全不一致的行为。
== 运算符通常与过滤 data.frames 结合使用。
在这种情况下,dplyr::filter 将仅保留条件计算结果为 TRUE 的行,这与 [ 不同。这有效地实现了==,但其中1 == NA 评估为FALSE。
例子:
> df <- data.frame(col1= c("a", "b", NA), col2= 1:3)
> df
col1 col2
1 a 1
2 b 2
3 <NA> 3
> dplyr::filter(df, col1=="a")
col1 col2
1 a 1
【讨论】: