36

这是一个向量

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

我想要一个简单的函数,它TRUE每次在“a”中有TRUEa,并且FALSE每次在“a”中有 aFALSE或 a时都会返回NA

以下三件事不起作用

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

这是一个解决方案

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

但这似乎不是一个简单易行的解决方案

还有其他解决方案吗?

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

identical()
isTRUE()
is.na()
na.rm()
&
|
!
  • TRUE还有哪些对处理, , FALSE,NA有用的其他功能(运算符、提示等...)NaN

  • NA和 和有什么区别NaN

  • 除了、和之外TRUE,还有其他“逻辑事物”吗?FALSENANaN

非常感谢 !

4

5 回答 5

63

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

a = c(T,F,NA)

a %in% TRUE

[1]  TRUE FALSE FALSE
于 2014-11-19T11:33:05.160 回答
17

按顺序回答您的问题:

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)
   }

2)NA代表“不可用”,与一般的NaN(“非数字”)不同。NA 一般用于一个数字的默认值,以代替缺失数据;NaN 通常是由于数字问题(取 -1 或类似的日志)而生成的。

3)我不太确定你所说的“逻辑事物”是什么意思——许多不同的数据类型,包括数字向量,都可以用作逻辑运算符的输入。您可能想尝试阅读 R 逻辑运算符页面:http ://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html 。

希望这可以帮助!

于 2013-05-29T19:58:37.597 回答
9

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

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

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

a <- a & !is.na(a)
于 2013-05-29T20:32:57.987 回答
7

按照上面 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
于 2014-11-12T00:27:17.060 回答
7

我喜欢 is.element 函数:

is.element(a, T)
于 2015-06-11T13:21:24.443 回答