0 <NA>
7 23
(Ann.: I made the values up. But the relations equal real world data.)
I had expected to get back a factor or at least a numeric variable
containing 0, 1 and NA, instead 1 is not included.
I searched the web for information on the treatment of logical expressions
when the data contains NA. I found:
1.
https://stat.ethz.ch/R-manual/R-devel/library/base/html/NA.html
Examples
# Some logical operations do not return NA
c(TRUE, FALSE) & NA
c(TRUE, FALSE) | NA
2.
https://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.html
NA is a valid logical object. Where a component of x or y is NA, the
result will be NA if the outcome is ambiguous. In other words NA & TRUE
evaluates to NA, but NA & FALSE evaluates to FALSE. See the examples
below.
## construct truth tables :
x <- c(NA, FALSE, TRUE)
names(x) <- as.character(x)
outer(x, x, "&") ## AND table
outer(x, x, "|") ## OR table
Ann. Not very useful. How should it be read?
3.
http://www.ats.ucla.edu/stat/r/faq/missing.htm
Good explanation for NA in general and in analysis, but no information
about NA in logical expressions.
Then I made some tests with different data types and variables with NA:
-- cut --
# 2016-04-27-001_truth_table_for_logicals_and_NA.R
# Test 1
var2 <- c(TRUE, FALSE)
var3 <- c(NA, NA)
var1 <- c(1, 1)
ds <- data.frame(var1, var2, var3)
ds
ds$value_and_logical <- ifelse(ds$var1 | ds$var2, TRUE, FALSE)
ds$logical_and_na <- ifelse(ds$var2 | ds$var3, TRUE, FALSE)
ds$value_and_na <- ifelse(ds$var1 | ds$var3, TRUE, FALSE)
print(ds)
# Output
# var1 var2 var3 value_and_logical logical_and_na value_and_na
# 1 1 TRUE NA TRUE TRUE TRUE
# 2 1 FALSE NA TRUE NA TRUE
# Test 2
ds$var1 <- factor(ds$var1, levels = c(0, 1), labels = c("NOT ok", "OK"))
ds$var2 <- factor(ds$var2, levels = c(0, 1), labels = c("NOT ok", "OK"))
ds$var3 <- factor(ds$var3, levels = c(0, 1), labels = c("NOT ok", "OK"))
ds$value_and_logical <- ifelse(ds$var1 | ds$var2, TRUE, FALSE)
ds$logical_and_na <- ifelse(ds$var2 | ds$var3, TRUE, FALSE)
ds$value_and_na <- ifelse(ds$var1 | ds$var3, TRUE, FALSE)
# Output (abbrev.)
# Warning message:
# In Ops.factor(ds$var1, ds$var3) : ?|? ist nicht sinnvoll f?r Faktoren
print(ds)
# Output
# var1 var2 var3 value_and_logical logical_and_na value_and_na
# 1 OK <NA> <NA> NA NA NA
# 2 OK <NA> <NA> NA NA NA
-- cut --
I had expected to get the same result in Test 2 as in Test 1.
Where can I find information and documentation about NA handling in
logical expressions on different variable types?
Kind regards
Georg