[R] ifelse -does it "manage the indexing"?

David Winsemius dwinsemius at comcast.net
Wed Dec 4 02:28:52 CET 2013


On Dec 3, 2013, at 5:37 AM, Hadley Wickham wrote:

> A better solution to this problem is to use character indexing:
> 
> x <- c("Tuesday", "Thursday", "Sunday")
> c(Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5,
> Saturday = 6, Sunday = 7)[x]
> 
> http://adv-r.had.co.nz/Subsetting.html#lookup-tables-character-subsetting

That does seem more expressive than using match:

x <- c("Tuesday", "Thursday", "Sunday")
match(x, c('Monday', 'Tuesday', 'Wednesday' ,'Thursday' ,
                   'Friday',  'Saturday', 'Sunday') ) 
[1] 2 4 7

It would also lend itself well to grouping operations

x <- c("Tuesday", "Thursday", "Sunday")
c(Monday = 'first half', Tuesday = 'first half',
  Wednesday = "hump", 
  Thursday = 'second half', Friday = 'second half',
  Saturday = "weekend", Sunday = "weekend")[x]

      Tuesday      Thursday        Sunday 
 "first half" "second half"     "weekend" 

The corresponding use case with match would be:

c(rep('first half',2),"hump", rep('second half',2), rep("weekend",2) )[
           match(x, c('Monday', 'Tuesday', 'Wednesday' ,'Thursday' ,
                    'Friday',  'Saturday', 'Sunday') ) ]
[1] "first half"  "second half" "weekend"    

And your recommended method has the virtue of performing the same partial matching allowed by charmatch:

 x2 <- substr(x, 1,3)
 charmatch(x2, c('Monday', 'Tuesday', 'Wednesday' ,'Thursday' ,
                    'Friday',  'Saturday', 'Sunday') )
#[1] 2 4 7
 c(Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5,
     Saturday = 6, Sunday = 7)[x]
# Tuesday Thursday   Sunday 
#       2        4        7 

-- 
David.

> 
> Hadley
> 
> On Mon, Dec 2, 2013 at 6:33 PM, Bill <william108 at gmail.com> 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.
>>  Thanks.
>> 
>>        [[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.
> 
> 
> 
> -- 
> http://had.co.nz/
> 
> ______________________________________________
> 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.

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list