提问人:Remi.b 提问时间:5/30/2013 最后编辑:Gregor ThomasRemi.b 更新时间:3/5/2019 访问量:57876
处理 TRUE、FALSE、NA 和 NaN
Dealing with TRUE, FALSE, NA and NaN
问:
这是一个向量
a <- c(TRUE, FALSE, FALSE, NA, FALSE, TRUE, NA, FALSE, TRUE)
我想要一个简单的函数,每当“a”中有 a 时返回,并且每次“a”中有 a 或 a 时都会返回。TRUE
TRUE
FALSE
FALSE
NA
以下三件事不起作用
a == TRUE
identical(TRUE, a)
isTRUE(a)
这是一个解决方案
a[-which(is.na(a))]
但这似乎不是一个简单明了的解决方案
还有其他解决方案吗?
以下是我知道的一些函数(和运算符):
identical()
isTRUE()
is.na()
na.rm()
&
|
!
还有哪些其他功能(运算符、提示等,...) 对处理 、 、 、 ?
TRUE
FALSE
NA
NaN
和 和有什么不一样?
NA
NaN
除了 、 和 之外,还有其他“合乎逻辑的东西”吗?
TRUE
FALSE
NA
NaN
多谢!
答:
按顺序回答您的问题:
1) 运营商确实没有像您期望的那样对待 NA。一个非常有用的函数是 r-cookbook.com 中的这个函数:==
compareNA
compareNA <- function(v1,v2) {
# This function returns TRUE wherever elements are the same, including NA's,
# and false everywhere else.
same <- (v1 == v2) | (is.na(v1) & is.na(v2))
same[is.na(same)] <- FALSE
return(same)
}
2)NA代表“不可用”,与一般的NaN(“不是一个数字”)不同。NA 通常用作数字的默认值,以代表缺失数据;NaN 通常是由于数值问题(取 -1 或类似的对数)而生成的。
3)我不太确定你所说的“逻辑事物”是什么意思——许多不同的数据类型,包括数值向量,都可以用作逻辑运算符的输入。你可能想要尝试阅读 R 逻辑运算符页面:http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html。
希望这有帮助!
评论
Inf
Inf - Inf
NaN
NaN
log(-1)
所以你希望 TRUE 保持 TRUE,FALSE 保持 FALSE,唯一真正的变化是 NA 需要变成 FALSE,所以只需像这样进行以下更改:
a[ is.na(a) ] <- FALSE
或者你可以改写说,只有当它是 TRUE 并且没有丢失时,它才是 TRUE:
a <- a & !is.na(a)
根据上面 Ben Bolker 的建议,您可以按照 is.na() 语法设置自己的函数
is.true <- function(x) {
!is.na(x) & x
}
a = c(T,F,F,NA,F,T,NA,F,T)
is.true(a)
[1] TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
这也适用于子集数据。
b = c(1:9)
df <- as.data.frame(cbind(a,b))
df[is.true(df$a),]
a b
1 1 1
6 1 6
9 1 9
并有助于避免在数据中确实存在 NA 的情况下意外合并空行。
df[df$a == TRUE,]
a b
1 1 1
NA NA NA
6 1 6
NA.1 NA NA
9 1 9
评论
ifelse()
!is.na(x) & x
你不需要在函数中包装任何东西 - 以下工作原理
a = c(T,F,NA)
a %in% TRUE
[1] TRUE FALSE FALSE
评论
'%in%'(aamc$forgive, FALSE)
apply
我喜欢is.element-function:
is.element(a, T)
评论
Vectorize(isTRUE)(a)
!is.na(x) & x
TRUE
FALSE
NA
NaN
NA
NaN
isTRUE
is.na
all.equal
is.finite
is.nan
a[-which(is.na(a))]
a
sapply(a, isTRUE)