处理 TRUE、FALSE、NA 和 NaN

Dealing with TRUE, FALSE, NA and NaN

提问人:Remi.b 提问时间:5/30/2013 最后编辑:Gregor ThomasRemi.b 更新时间:3/5/2019 访问量:57876

问:

这是一个向量

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

我想要一个简单的函数,每当“a”中有 a 时返回,并且每次“a”中有 a 或 a 时都会返回。TRUETRUEFALSEFALSENA

以下三件事不起作用

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

这是一个解决方案

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

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

还有其他解决方案吗?

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

identical()
isTRUE()
is.na()
na.rm()
&
|
!
  • 还有哪些其他功能(运算符、提示等,...) 对处理 、 、 、 ?TRUEFALSENANaN

  • 和 和有什么不一样?NANaN

  • 除了 、 和 之外,还有其他“合乎逻辑的东西”吗?TRUEFALSENANaN

多谢!

布尔 逻辑运算符 na r-faq

评论

6赞 Matthew Plourde 5/30/2013
要回答您的第一个问题,这里有一种方法:.Vectorize(isTRUE)(a)
1赞 Ben Bolker 5/30/2013
更狭隘地说,我认为应该有效,只要您期望的值肯定包含在 {, , , } 中......!is.na(x) & xTRUEFALSENANaN
0赞 Ben Bolker 5/30/2013
我觉得其中一些区别(vs、vs等)一定在其他地方/以前讨论过,甚至可能在 StackOverflow 上讨论过。谷歌搜索“na nan is.finite is.nan is.na”让我 stat.ethz.ch/R-manual/R-devel/library/base/html/is.finite.html,奇怪的是,它没有“另请参阅”stat.ethz.ch/R-manual/R-devel/library/base/html/NA.htmlNANaNisTRUEis.na
0赞 Ben Bolker 5/30/2013
为了完整起见,我会在上面的列表中添加 、 和 ......all.equalis.finiteis.nan
4赞 G. Grothendieck 5/30/2013
NaN 是数字,因此您不能在逻辑向量中遇到它。提出的解决方案只有 7 个元素,而有 9 个元素。你确定这就是你想要的吗?也许这就是你想要的?a[-which(is.na(a))]asapply(a, isTRUE)

答:

17赞 ben 5/30/2013 #1

按顺序回答您的问题:

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

希望这有帮助!

评论

0赞 Matthew Plourde 5/30/2013
除以 0 是 ,但会给出 。很多时候,如果生成 s,R 函数会引发异常,例如 .InfInf - InfNaNNaNlog(-1)
0赞 JRC 3/4/2022
eq = function(x,y) is.element(x == y, TRUE) |is.na(x) & is.na(y)
10赞 Greg Snow 5/30/2013 #2

所以你希望 TRUE 保持 TRUE,FALSE 保持 FALSE,唯一真正的变化是 NA 需要变成 FALSE,所以只需像这样进行以下更改:

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

或者你可以改写说,只有当它是 TRUE 并且没有丢失时,它才是 TRUE:

a <- a & !is.na(a)
7赞 JWilliman 11/12/2014 #3

根据上面 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

评论

0赞 Ben Bolker 11/19/2014
你真的不需要这里 - 正如@GregSnow的回答所指出的,是等价的ifelse()!is.na(x) & x
0赞 Jim Maas 6/14/2020
本,我真的同意这一点,它有效,但遵循逻辑并不简单,因为你进入了双重和三重否定范式......我们中的许多人都觉得很难遵循。难道没有一种更好、更直接的方法不依赖于双重否定吗?
70赞 wjchulme 11/19/2014 #4

你不需要在函数中包装任何东西 - 以下工作原理

a = c(T,F,NA)

a %in% TRUE

[1]  TRUE FALSE FALSE

评论

11赞 Ari B. Friedman 2/8/2015
不错的解决方案。您可以以功能形式使用它:这对同类产品很有用。'%in%'(aamc$forgive, FALSE)apply
0赞 Jim Maas 6/14/2020
当尝试构建不会抛出错误的函数时,当使用涉及“>=”、“<=”、“==”等的逻辑测试时,当它可能根据 NA 进行评估时,非常好和有用的解决方案。
7赞 skeletor 6/11/2015 #5

我喜欢is.element-function:

is.element(a, T)