[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