【问题标题】:Dealing with TRUE, FALSE, NA and NaN处理 TRUE、FALSE、NA 和 NaN
【发布时间】:2013-05-29 19:37:24
【问题描述】:

这是一个向量

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

我想要一个简单的函数,每当“a”中有TRUE 时返回TRUE,每当“a”中有FALSENA 时返回FALSE

以下三件事不起作用

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

这是一个解决方案

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

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

还有其他解决方案吗?

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

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

  • NANaN有什么区别?

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

非常感谢!

【问题讨论】:

  • 要回答您的第一个问题,这里有一个方法:Vectorize(isTRUE)(a)
  • 更严格地说,我认为 !is.na(x) &amp; x 应该可以工作,只要您期望的值肯定包含在 {TRUE, FALSE, NA, NaN} 中。 ..
  • 我觉得其中一些区别(NA vs NaNisTRUE vs is.na 等)必须在其他地方/以前讨论过,甚至可能在 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.html
  • 为了完整起见,我会在上面的列表中添加all.equalis.finiteis.nan ...
  • NaN 是数字,因此您无法在逻辑向量中遇到它。建议的解决方案 a[-which(is.na(a))] 只有 7 个元素,而 a 有 9 个元素。你确定那是你想要的吗?也许sapply(a, isTRUE) 是你想要的?

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


【解决方案1】:

您不需要在函数中包装任何东西 - 以下是有效的

a = c(T,F,NA)

a %in% TRUE

[1]  TRUE FALSE FALSE

【讨论】:

  • 不错的解决方案。您可以以函数形式使用它:'%in%'(aamc$forgive, FALSE),这对apply 及其同类很有用。
  • 在尝试构建不会引发错误等的函数时,使用涉及 ">="、"
【解决方案2】:

按顺序回答您的问题:

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

希望这会有所帮助!

【讨论】:

  • 除以 0 是Inf,但Inf - Inf 给你NaN。很多时候,如果生成了NaNs,R 函数会引发异常,例如,log(-1)
  • eq = function(x,y) is.element(x == y, TRUE) | is.na(x) & is.na(y)
【解决方案3】:

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

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

或者你可以换种说法,如果它是 TRUE 并且没有缺失,它就是 TRUE:

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

【讨论】:

    【解决方案4】:

    按照上面 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()——正如@GregSnow 的回答所指出的,!is.na(x) &amp; x 是等价的
    • Ben,我真的同意这一点,它确实有效,但遵循逻辑并不直接,因为你会陷入双重和三重否定范式......我们中的许多人都很难理解.有没有更好、更直接的方法,不依赖双重否定?
    【解决方案5】:

    我喜欢 is.element-function:

    is.element(a, T)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 2013-12-17
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 2016-03-27
      相关资源
      最近更新 更多