[R] recoding one variable into another - but differently for different cases

Gabor Grothendieck ggrothendieck at gmail.com
Wed Jan 23 03:13:51 CET 2008


Note that if you do use NA rather than 99 as others have suggested then
the A==4 term should use ifelse rather than multiplication since 0 *
NA = NA, not 0:

transform(Data, new =
   (A == 1) * ((B == 1) - (B == 2)) + (A == 2) * ((B == 2) - (B ==1))
+ ifelse(A == 4, NA, 0))

In fact, although more verbose, if you find ifelse clearer you might
use it in all three terms:

On Jan 22, 2008 5:01 PM, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> Slight correction of the English:
>
> - if A is 1 then the first term equals the coefficient of (A == 1).
>  That is the first term equals 1 if B==1 and equals -1 if B==2.
>  If A does not equal 1 then the first term is zero and can be ignored.
> - terms 2 and 3 are interpreted analogously
> - if A==3 (or other value) then the (A==?) part of each term equals
>  zero so the entire expression is zero.
>
>
> On Jan 22, 2008 2:08 PM, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> > You could create a lookup table or use recode in the car package.
> >
> > Another possibility is to use a logical/arithmetic expression.  The
> > following expression says that
> >
> > - if A is 1 then use the first term equals the coefficient, namely 1
> > if B ==1 and -1 if B == 2.
> >  Also, if A is not 1 then that term is zero and can be ignored.
> > - if A is 2 or 99 then the second or third terms are used analogously
> > - otherwise no terms are selected and the expression equals zero
> >
> >   transform(Data, new =
> >      (A == 1) * ((B == 1) - (B == 2)) + (A == 2) * ((B == 2) - (B ==
> > 1)) + (A == 4) * 99)
> >
> > This could be reduced even more although at the expense of
> > understandability, e.g.
> >
> >   transform(Data, new = ifelse(A > 2, 99 * (A == 4), (A == B) - (A != B)))
> >
> >
> > On Jan 22, 2008 12:25 PM, Dimitri Liakhovitski <ld7631 at gmail.com> wrote:
> > > Hello,
> > > I have 2 variables in my sample Data: Data$A and Data$B
> > > Variable Data$A can assume values: 1, 2, 3, and 4.
> > > Variable Data$B identifies my cases and can assume values: 1 and 2.
> > >
> > > I need to recode my variable Data$A into a new variable Data$new such that:
> > >
> > > People who are Data[Data$B %in% 1, ]  are recoded like this:
> > >
> > > Value on Data$A    Value on Data$new
> > > 1                             +1
> > > 2                             -1
> > > 3                             0
> > > 4                             99
> > >
> > > People who are Data[Data$B %in% 2, ]  are recoded like this:
> > >
> > > Value on Data$A    Value on Data$new
> > > 1                             -1
> > > 2                             +1
> > > 3                             0
> > > 4                             99
> > >
> > > I am having hard time doing this. Any help would be greatly appreciated.
> > > Dimitri
> > >
> > > ______________________________________________
> > > 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