[R] ifelse -does it "manage the indexing"?
William Dunlap
wdunlap at tibco.com
Tue Dec 3 02:16:23 CET 2013
> It seems so inefficient.
But ifelse knows nothing about the expressions given
as its second and third arguments -- it only sees their
values after they are evaluated. Even if it could see the
expressions, it would not be able to assume that f(x[i])
is the same as f(x)[i] or things like
ifelse(x>0, cumsum(x), cumsum(-x))
would not work.
You can avoid the computing all of f(x) and then extracting
a few elements from it by doing something like
x <- c("Wednesday", "Monday", "Wednesday")
z1 <- character(length(x))
z1[x=="Monday"] <- "Mon"
z1[x=="Tuesday"] <- "Tue"
z1[x=="Wednesday"] <- "Wed"
or
LongDayNames <- c("Monday","Tuesday","Wednesday")
ShortDayNames <- c("Mon", "Tue", "Wed")
z2 <- character(length(x))
for(i in seq_along(LongDayNames)) {
z2[x==LongDayNames[i]] <- ShortDayNames[i]
}
To avoid the repeated x==value[i] you can use match(x, values).
z3 <- ShortDayNames[match(x, LongDayNames)]
z1, z2, and z3 are identical character vectors.
Or, you can use factors.
> factor(x, levels=LongDayNames, labels=ShortDayNames)
[1] Wed Mon Wed
Levels: Mon Tue Wed
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Bill
> Sent: Monday, December 02, 2013 4:50 PM
> To: Duncan Murdoch
> Cc: r-help at r-project.org
> Subject: Re: [R] ifelse -does it "manage the indexing"?
>
> It seems so inefficient. I mean the whole first vector will be evaluated.
> Then if the second if is run the whole vector will be evaluated again. Then
> if the next if is run the whole vector will be evaluted again. And so on.
> And this could be only to test the first element (if it is false for each
> if statement). Then this would be repeated again and again. Is that really
> the way it works? Or am I not thinking clearly?
>
>
> On Mon, Dec 2, 2013 at 4:48 PM, Duncan Murdoch
> <murdoch.duncan at gmail.com>wrote:
>
> > On 13-12-02 7:33 PM, Bill wrote:
> >
> >> ifelse ((day_of_week == "Monday"),1,
> >> ifelse ((day_of_week == "Tuesday"),2,
> >> ifelse ((day_of_week == "Wednesday"),3,
> >> ifelse ((day_of_week == "Thursday"),4,
> >> ifelse ((day_of_week == "Friday"),5,
> >> ifelse ((day_of_week == "Saturday"),6,7)))))))
> >>
> >>
> >> In code like the above, day_of_week is a vector and so day_of_week ==
> >> "Monday" will result in a boolean vector. Suppose day_of_week is Monday,
> >> Thursday, Friday, Tuesday. So day_of_week == "Monday" will be
> >> True,False,False,False. I think that ifelse will test the first element
> >> and
> >> it will generate a 1. At this point it will not have run day_of_week ==
> >> "Tuesday" yet. Then it will test the second element of day_of_week and it
> >> will be false and this will cause it to evaluate day_of_week == "Tuesday".
> >> My question would be, does the evaluation of day_of_week == "Tuesday"
> >> result in the generation of an entire boolean vector (which would be in
> >> this case False,False,False,True) or does the ifelse "manage the indexing"
> >> so that it only tests the second element of the original vector (which is
> >> Thursday) and for that matter does it therefore not even bother to
> >> generate
> >> the first boolean vector I mentioned above (True,False,False,False) but
> >> rather just checks the first element?
> >> Not sure if I have explained this well but if you understand I would
> >> appreciate a reply.
> >>
> >
> > See the help for the function. If any element of the test is true, the
> > full first vector will be evaluated. If any element is false, the second
> > one will be evaluated. There are no shortcuts of the kind you describe.
> >
> > Duncan Murdoch
> >
> >
>
> [[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.
More information about the R-help
mailing list