[R] ifelse problem - bug or operator error

Rui Barradas ruipbarradas at sapo.pt
Fri Aug 24 23:28:10 CEST 2012


Hello,

Michael's standard guess, FAQ 7.31, was also mine, but is wrong. The 
error is in Jennifer's flag column,  not the result of her ifelse. (!)


x <- scan(what="character", text="
  PM.EXP PM.DIST.TOT PM.DIST_flag  0 0 0  0 0 0  0 0 0  177502 1 0 31403 1
0  0 0 0  1100549 1 0  38762 1 0  0 0 0  20025 1 0  0 0 0  13742 1 0  0 0 0
83078 1 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
165114 1 0  0 0 0  417313 1 0  3546 1 0  4613 1 0  225460 1 0  6417 1 1  23
1 0  3402 1 0  8504 1 1  8552 1 0  9723 1 0  37273 1 1  396 1 0 1478 1 0
2074 1 0  12220 1 1  97691 2 1  0 0 0  33993 2 1
")

vn <- matrix(as.numeric(x[-(1:3)]), ncol=3, byrow=TRUE)
vn <- data.frame(vn)
names(vn) <- x[1:3]
str(vn)
vn$flag2 <- ifelse( (vn$PM.EXP > 0.0) & (vn$PM.DIST.TOT != 1.0), 1, 0 )

str(vn)
identical(vn$PM.DIST_flag, vn$flag2)  # FALSE
inx <- vn$PM.DIST_flag != vn$flag2
vn[inx, ]

As you can see, there's nothing wrong with ifelse. The second standard 
guess is that Jennifer had something, a variable, in her session messing 
up with the variables envolved in the ifelse.

Also, when the result of a if/else or ifelse is, by this order, 1 or 0, 
the following can be used, with performance benefits.

vn$flag3 <- 1 * (vn$PM.EXP > 0.0 & vn$PM.DIST.TOT != 1.0) # make T/F 
numeric 1/0

Hope this helps,

Rui Barradas
Em 24-08-2012 21:43, Jennifer Sabatier escreveu:
> Oops, sorry, I thought I was in plain text.  I can't tell the
> difference because I use so little formatting in my emails.
>
> Try this (a truncated version since I have to hand space everything):
>
> PM.EXP	PM.DIST.TOT	PM.DIST_flag
> 0	       0	                        0
> 6417       1	                        1
> 23	       1	                        0
> 97691	2	                        1
> 0	       0	                        0
> 33993	2	                        1
>
>
> On Fri, Aug 24, 2012 at 4:36 PM, R. Michael Weylandt
> <michael.weylandt at gmail.com> wrote:
>> On Fri, Aug 24, 2012 at 3:22 PM, Jennifer Sabatier
>> <plessthanpointohfive at gmail.com> wrote:
>>> Hi R-Helpers,
>>>
>>> I don't think I need to post a dataset for this question but if I do, I
>>> can.  Anyway, I am having a lot of trouble with the ifelse command.
>>>
>> You probably should have: dput() makes it super easy as well.
>>
>>> Here is my code:
>>>
>>>
>>> vn$PM.DIST_flag <- ifelse( (vn$PM.EXP > 0.0) & (vn$PM.DIST.TOT != 1.0),
>>> 1,
>>> 0 )
>>>
>>>
>>> And here is my output that doesn't make ANY sense:
>>>
>>>    PM.EXP PM.DIST.TOT PM.DIST_flag  0 0 0  0 0 0  0 0 0  177502 1 0
>>> 31403 1
>>> 0  0 0 0  1100549 1 0  38762 1 0  0 0 0  20025 1 0  0 0 0  13742 1 0  0
>>> 0 0
>>> 83078 1 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
>>> 165114 1 0  0 0 0  417313 1 0  3546 1 0  4613 1 0  225460 1 0  6417 1 1
>>> 23
>>> 1 0  3402 1 0  8504 1 1  8552 1 0  9723 1 0  37273 1 1  396 1 0  1478 1
>>> 0
>>> 2074 1 0  12220 1 1  97691 2 1  0 0 0  33993 2 1
>> Indeed it makes no sense to me either because you sent HTML email
>> which got mangled by the server.
>>
>>> As you can see, there are many instances where PM.EXP > 0 and
>>> PM.DIST.TOT =
>>> 1 yet PM.DIST_flag = 1 and it should be 0.  It should only flag in cases
>>> such as the last line of data.
>>>
>>> WWHHHYYYYYYYY???? Why why why why why why why? Why?
>>>
>>> (Sorry, I've been trying to figure this out for hours and I've devolved
>>> to
>>> mumbling in corners and banging my head against the table)
>>>
>>> What in the world am I doing wrong?  Or is ifelse not the right
>>> function?
>> First guess.... standard problems with equality of floating point
>> numbers. (See R FAQ 7.31 for the details)
>>
>> You probably want to change
>>
>> x == 1
>>
>> to
>>
>> abs(x - 1) < 1e-05
>>
>> or something similar.
>>
>> Cheers,
>> Michael
>>
>>> Best,
>>>
>>> Jen
>>>
>>>          [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> 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.
> ______________________________________________
> R-help at r-project.org mailing list
> 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.




More information about the R-help mailing list