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
______________________________________________
R-help@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.