这是一个载体
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()
&
|
!
有哪些其他功能(操作员,提示,等等......)
有用处理TRUE
,FALSE
,NA
,NaN
?
NA
和NaN
之间有什么区别?
除了TRUE
,FALSE
,NA
和NaN
还有其他“逻辑事物”吗?
非常感谢!
答案 0 :(得分:49)
您不需要在函数中包装任何内容 - 以下作品
a = c(T,F,NA)
a %in% TRUE
[1] TRUE FALSE FALSE
答案 1 :(得分:11)
按顺序回答您的问题:
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。
希望这有帮助!
答案 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)