Rem*_*i.b 26 boolean r logical-operators r-faq na
这是一个矢量
a <- c(TRUE, FALSE, FALSE, NA, FALSE, TRUE, NA, FALSE, TRUE)
Run Code Online (Sandbox Code Playgroud)
我想要一个简单的函数,TRUE每当有一个TRUE"a"时返回,并且FALSE每次有一个FALSE或一个NA在"a"中.
以下三件事情无效
a == TRUE
identical(TRUE, a)
isTRUE(a)
Run Code Online (Sandbox Code Playgroud)
这是一个解决方案
a[-which(is.na(a))]
Run Code Online (Sandbox Code Playgroud)
但它似乎不是一个简单易行的解决方案
还有其他解决方案吗?
以下是我所知道的一些函数(和运算符):
identical()
isTRUE()
is.na()
na.rm()
&
|
!
Run Code Online (Sandbox Code Playgroud)
有什么其他功能(运营商,技巧,什么的,......),它们处理非常有用TRUE,FALSE,NA,NaN?
NA和之间有什么区别NaN?
是否有其他"顺理成章之事"比TRUE,FALSE,NA和NaN?
非常感谢 !
wjc*_*lme 51
您不需要在函数中包装任何内容 - 以下工作
a = c(T,F,NA)
a %in% TRUE
[1] TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
ben*_*ben 13
按顺序回答您的问题:
1)==运营商确实没有像你期望的那样对待NA.一个非常有用的功能是compareNA来自r-cookbook.com的这个功能:
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)
}
Run Code Online (Sandbox Code Playgroud)
2)NA代表"不可用",与一般NaN("非数字")不同.NA通常用于代表缺失数据的数字的默认值; 通常生成NaN是因为数字问题(记录-1或类似的对数).
3)我不太确定"逻辑事物"是什么意思 - 许多不同的数据类型,包括数字向量,可以用作逻辑运算符的输入.您可能想尝试阅读R逻辑运算符页面:http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html.
希望这可以帮助!
所以你想要TRUE保持TRUE而FALSE保持FALSE,唯一真正的变化是NA需要变为FALSE,所以只需要做这样的改变:
a[ is.na(a) ] <- FALSE
Run Code Online (Sandbox Code Playgroud)
或者你可以改为说它只有TRUE,如果它是真的并且没有丢失:
a <- a & !is.na(a)
Run Code Online (Sandbox Code Playgroud)
根据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
Run Code Online (Sandbox Code Playgroud)
这也适用于子集化数据.
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
Run Code Online (Sandbox Code Playgroud)
并且有助于避免在数据中存在NA的情况下意外地合并空行.
df[df$a == TRUE,]
a b
1 1 1
NA NA NA
6 1 6
NA.1 NA NA
9 1 9
Run Code Online (Sandbox Code Playgroud)