[R] Conditional recoding

David Winsemius dwinsemius at comcast.net
Sat Feb 19 23:14:14 CET 2011


On Feb 19, 2011, at 4:36 PM, Krishnan Viswanathan wrote:

> I am trying to recode a variable into another variable and while the  
> package
> 'car' works well when it is only recoding A into B, I am not sure I  
> can do
> the same with recoding (A or C) into B. If i can use recode please  
> advise on
> how to. So i am using an if/else if conditions.

If you are using if-else logic to transform vectors, you should use  
the ifelse function which will work on vectors rather than the if() 
{}else{} control structure which only accepts a single element. You  
should also learn to distinguish the "|" operator that retruns vectors  
from vectors, versus the "||" operator which is used with if(). Notice  
that it would be improper to pair "||" operations with "&"

(All this is explained in ?ifelse .)
>
> My sample dataset is below along with the code and the warning and  
> results i
> get.
>
> TIA
> Krishnan
>
> #****Code****
> attach(airport_survey)

If airport_survey is an available dataset then you should specify  
which package contains it.

> if(AccessMode == 1 || AccessMode == 8 || AccessMode == 9) {
>       airport_survey$amodecat <- 1
> } else if (AccessMode == 2) {
>       airport_survey$amodecat <- 2
> } else if (AccessMode == 3 & rentalcat == 1 || AccessMode == 4 &  
> rentalcat
> == 1) {
>        airport_survey$amodecat <- 3
> } else if (AccessMode == 5) {
>       airport_survey$amodecat <- 8
> } else if (AccessMode == 6 || AccessMode == 14) {
>       airport_survey$amodecat <- 9
> } else if (AccessMode == 7) {
>       airport_survey$amodecat <- 5
> } else if (AccessMode == 10) {
>       airport_survey$amodecat <- 7
> } else if (AccessMode == 11 || AccessMode == 12) {
>       airport_survey$amodecat <- 4
> } else if (AccessMode == 13) {
>       airport_survey$amodecat <- 6
> } else if(AccessMode == 3 & rentalcat == 2 ||AccessMode == 4 &  
> rentalcat ==
> 2) {
>       airport_survey$amodecat <- 10
> } else { # else statement here just to close out the condition
>       airport_survey$amodecat <- 0
> }
>
>
> #*****dataset****

And if this is what you are calling airport_survey then you should  
offer code that will read it in:

airport_survey <- read.table(textConnection("AccessMode RentalCat
4 2
4 1
4 2
3 1
3 2
14 1
1 1
2 1
8 1
9 1
10 1
11 1
12 1
13 1
6 1
5 1
7 2"), header=TRUE)

May want to do this in stages although you can nest up to 7 ifelse's.  
I will illustrate the first couple:
(Note: I NEVER USE attach(), use with() instead.

airport_survey$amodecat <- NA
airport_survey$amodecat <- with(airport_survey, ifelse( AccessMode %in 
% c(1,8,9) ,  1, amodecat)
airport_survey$amodecat <- with(airport_survey, ifelse( AccessMode ==  
2 ,  2, amodecat)
airport_survey$amodecat <- with(airport_survey, ifelse( (AccessMode ==  
3 & rentalcat == 1) | (AccessMode == 4 & rentalcat == 1) ,  3, amodecat)
... and so on.



> # Warning + Results
>
> Warning messages:
> 1: In if (AccessMode == 2) { :
>  the condition has length > 1 and only the first element will be used
> 2: In if (AccessMode == 5) { :
>  the condition has length > 1 and only the first element will be used
> 3: In if (AccessMode == 7) { :
>  the condition has length > 1 and only the first element will be used
> 4: In if (AccessMode == 10) { :
>  the condition has length > 1 and only the first element will be used
> 5: In if (AccessMode == 13) { :
>  the condition has length > 1 and only the first element will be used
>
> # After Running summary on the variable (it seems to only take the  
> last if
> condition)

Right. You made them all equal with the incorrect use of if(){}else{}.
>
>   amodecat
> Min.   :10
> 1st Qu.:10
> Median :10
> Mean   :10
> 3rd Qu.:10
> Max.   :10
>
> -- 
> Krishnan Viswanathan
> 1101 High Meadow Dr


David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list