处理TRUE,FALSE,NA和NaN

时间:2013-05-29 19:37:24

标签: r boolean logical-operators na r-faq

这是一个载体

a <- c(TRUE, FALSE, FALSE, NA, FALSE, TRUE, NA, FALSE, TRUE)

我想要一个简单的函数,每当“a”中有TRUE时返回TRUE,并且每次有FALSE或{{FALSE时都会NA 1}}在“a”中。

以下三件事情无效

a == TRUE
identical(TRUE, a)
isTRUE(a)

这是一个解决方案

a[-which(is.na(a))]

但它似乎不是一个简单明了的解决方案

还有其他解决方案吗?

以下是我所知道的一些函数(和运算符):

identical()
isTRUE()
is.na()
na.rm()
&
|
!
  • 有哪些其他功能(操作员,提示,等等......) 有用处理TRUEFALSENANaN

  • NANaN之间有什么区别?

  • 除了TRUEFALSENANaN还有其他“逻辑事物”吗?

非常感谢!

5 个答案:

答案 0 :(得分:49)

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

a = c(T,F,NA)

a %in% TRUE

[1]  TRUE FALSE FALSE

答案 1 :(得分:11)

按顺序回答您的问题:

1)==运算符确实没有按照您的预期处理NA。一个非常有用的功能是来自r-cookbook.comcompareNA函数:

  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

希望这有帮助!

答案 2 :(得分:6)

所以你想要TRUE保持TRUE而FALSE保持FALSE,唯一真正的变化是NA需要变为FALSE,所以只需改变:

a[ is.na(a) ] <- FALSE

或者你可以改写一下,如果它是真的并且没有丢失它只是为真:

a <- a & !is.na(a)

答案 3 :(得分: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

这也适用于数据子集。

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

答案 4 :(得分:4)

我喜欢is.element-function:

is.element(a, T)