Interdependencies of variable types, logical expressions and NA
Hi Your script is not reproducible. Creating Check_U_0__Kd_1_2011 from Umsatz_2011 and Kunde01_2011 Error in ifelse(Kunden01[[Umsatz]] == 0 & Kunden01[[Kunde]] == 1, 1, 0) : object 'Kunden01' not found
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 PLEASE do read the posting guide http://www.R-project.org/posting- 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.