处理TRUE,FALSE,NA和NaN

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,NANaN

非常感谢 !

wjc*_*lme 51

您不需要在函数中包装任何内容 - 以下工作

a = c(T,F,NA)

a %in% TRUE

[1]  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 您可以在函数形式中使用它:`'%in%'(aamc $ forgive,FALSE)`这对于`apply`及其类似物很有用. (8认同)

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.

希望这可以帮助!


Gre*_*now 7

所以你想要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)


JWi*_*man 6

根据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)


ske*_*tor 6

我喜欢 is.element 函数:

is.element(a, T)
Run Code Online (Sandbox Code Playgroud)