# [R] Interdependencies of variable types, logical expressions and NA

PIKAL Petr petr.pikal at precheza.cz
Thu Apr 28 09:41:32 CEST 2016

```Hi

Creating Check_U_0__Kd_1_2011 from Umsatz_2011 and Kunde01_2011
Error in ifelse(Kunden01[[Umsatz]] == 0 & Kunden01[[Kunde]] == 1, 1, 0) :
>

This is interesting
x <- c(NA, FALSE, TRUE)
names(x) <- as.character(x)
outer(x, x, "&") ## AND table
<NA> FALSE  TRUE
<NA>     NA FALSE    NA
FALSE FALSE FALSE FALSE
TRUE     NA FALSE  TRUE
>

I am not sure, but the logic for AND is to return TRUE only when both expressions are TRUE.

so
T&T = T
F&F = F
T&NA = NA (you cannot decide hence NA)
F&NA = F (you can decide that regardless of NA the result must be F)

outer(x, x, "|") ## OR  table
<NA> FALSE TRUE
<NA>    NA    NA TRUE
FALSE   NA FALSE TRUE
TRUE  TRUE  TRUE TRUE

OTOH the logic for OR table is that if one of the expressions is TRUE the result must be TRUE
T | T = T
F | F = F
T&NA = T (you can decide that regardless value in NA the result must be T)
F&NA = NA (you cannot decide hence NA)

And I believe that all your results can be explained by this logic.

Cheers
Petr

> -----Original Message-----
> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of
> G.Maubach at weinwolf.de
> Sent: Thursday, April 28, 2016 9:08 AM
> To: r-help at r-project.org
> Subject: [R] Interdependencies of variable types, logical expressions and NA
>
> Hi All,
>
> my script tries to do the following on factors:
>
> > ## Check for case 3: Umsatz = 0 & Kunde = 1
> > for (year in 2011:2015) {
> +   Umsatz <- paste0("Umsatz_", year)
> +   Kunde <- paste0("Kunde01_", year)
> +   Check <- paste0("Check_U_0__Kd_1_", year)
> +
> +   cat('Creating', Check, 'from', Umsatz, "and", Kunde, '\n')
> +
> +   Kunden01[[ Check ]] <- ifelse(Kunden01[[ Umsatz ]] == 0 &
> +                                 Kunden01[[ Kunde ]] == 1,
> +                                 1, 0
> +                                 )
> +   Kunden01[[ Check ]] <- factor(Kunden01[[ Check ]],
> +                                 levels=c(1, 0),
> +                                 labels= c("Check 0", "OK")
> +                                 )
> +
> + }
> Creating Check_U_0__Kd_1_2011 from Umsatz_2011 and Kunde01_2011
> Creating Check_U_0__Kd_1_2012 from Umsatz_2012 and Kunde01_2012
> Creating Check_U_0__Kd_1_2013 from Umsatz_2013 and Kunde01_2013
> Creating Check_U_0__Kd_1_2014 from Umsatz_2014 and Kunde01_2014
> Creating Check_U_0__Kd_1_2015 from Umsatz_2015 and Kunde01_2015
> >
> > table(Kunden01\$Check_U_0__Kd_1_2011, useNA = "ifany")
>
> Check 0      OK    <NA>
>       1      16      13
> > table(Kunden01\$Check_U_0__Kd_1_2012, useNA = "ifany")
>
> Check 0      OK    <NA>
>       1      17      12
> > table(Kunden01\$Check_U_0__Kd_1_2013, useNA = "ifany")
>
> Check 0      OK    <NA>
>       2      17      13
> > table(Kunden01\$Check_U_0__Kd_1_2014, useNA = "ifany")
>
> Check 0      OK    <NA>
>       1      15      14
> > table(Kunden01\$Check_U_0__Kd_1_2015, useNA = "ifany")
>
> Check 0      OK    <NA>
>       2      15      13
> >
> > Kunden01\$Check_U_0__Kd_1_all <-
> ifelse(Kunden01\$Check_U_0__Kd_1_2011 ==
> 1 |
> +                                        Kunden01\$Check_U_0__Kd_1_2012 ==
> 1 |
> +                                        Kunden01\$Check_U_0__Kd_1_2013 ==
> 1 |
> +                                        Kunden01\$Check_U_0__Kd_1_2014 ==
> 1 |
> +                                        Kunden01\$Check_U_0__Kd_1_2015 ==
> 1,
> +                                        1, 0)
> >
> > table(Kunden01\$Check_U_0__Kd_1_all, useNA = "ifany")
>
>     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
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> guide.html
> and provide commented, minimal, self-contained, reproducible code.

________________________________
Tento e-mail a jakékoliv k němu připojené dokumenty jsou důvěrné a jsou určeny pouze jeho adresátům.
Jestliže jste obdržel(a) tento e-mail omylem, informujte laskavě neprodleně jeho odesílatele. Obsah tohoto emailu i s přílohami a jeho kopie vymažte ze svého systému.
Nejste-li zamýšleným adresátem tohoto emailu, nejste oprávněni tento email jakkoliv užívat, rozšiřovat, kopírovat či zveřejňovat.
Odesílatel e-mailu neodpovídá za eventuální škodu způsobenou modifikacemi či zpožděním přenosu e-mailu.

V případě, že je tento e-mail součástí obchodního jednání:
- vyhrazuje si odesílatel právo ukončit kdykoliv jednání o uzavření smlouvy, a to z jakéhokoliv důvodu i bez uvedení důvodu.
- a obsahuje-li nabídku, je adresát oprávněn nabídku bezodkladně přijmout; Odesílatel tohoto e-mailu (nabídky) vylučuje přijetí nabídky ze strany příjemce s dodatkem či odchylkou.
- trvá odesílatel na tom, že příslušná smlouva je uzavřena teprve výslovným dosažením shody na všech jejích náležitostech.
- odesílatel tohoto emailu informuje, že není oprávněn uzavírat za společnost žádné smlouvy s výjimkou případů, kdy k tomu byl písemně zmocněn nebo písemně pověřen a takové pověření nebo plná moc byly adresátovi tohoto emailu případně osobě, kterou adresát zastupuje, předloženy nebo jejich existence je adresátovi či osobě jím zastoupené známá.

This e-mail and any documents attached to it may be confidential and are intended only for its intended recipients.
If you received this e-mail by mistake, please immediately inform its sender. Delete the contents of this e-mail with all attachments and its copies from your system.
If you are not the intended recipient of this e-mail, you are not authorized to use, disseminate, copy or disclose this e-mail in any manner.
The sender of this e-mail shall not be liable for any possible damage caused by modifications of the e-mail or by delay with transfer of the email.

In case that this e-mail forms part of business dealings:
- the sender reserves the right to end negotiations about entering into a contract in any time, for any reason, and without stating any reasoning.
- if the e-mail contains an offer, the recipient is entitled to immediately accept such offer; The sender of this e-mail (offer) excludes any acceptance of the offer on the part of the recipient containing any amendment or variation.
- the sender insists on that the respective contract is concluded only upon an express mutual agreement on all its aspects.
- the sender of this e-mail informs that he/she is not authorized to enter into any contracts on behalf of the company except for cases in which he/she is expressly authorized to do so in writing, and such authorization or power of attorney is submitted to the recipient or the person represented by the recipient, or the existence of such authorization is known to the recipient of the person represented by the recipient.

```