[R] Multiple Conditional Tranformations

Gabor Grothendieck ggrothendieck at gmail.com
Sat Nov 25 16:25:03 CET 2006


Here are some additional solutions.  It appears that the SAS code is performing
the transformation row by row and for each row the code in your post is
specifying the transformation so if you want to do it that way we
could use 'by'
like this (where this time we have also added NA processing for the gender):


do.call(rbind, by(mydata, 1:nrow(mydata), function(x)
   switch(as.character(x$gender),
      m = transform(x, score1 = 3*q1+q2, score2 = 3.5*q1+q2),
      f = transform(x, score1 = 2*q1+q2, score2 = 2.5*q1+q2),
      NA)
))

# or this somewhat longer version:

do.call(rbind, by(mydata, 1:nrow(mydata), function(x) with(x, {
      if (is.na(gender)) {
          score1 <- score2 <- NA
      } else if (gender == "m") {
         score1 = 3 * q1 + q2
         score2 = 3.5 * q1 + q2
      } else if (gender == "f") {
         score1 = 2 * q1 + q2
         score2 = 2.5 * q1 + q2
      }
      cbind(x, score1, score2)
})))


  				




On 11/25/06, Muehnchen, Robert A (Bob) <muenchen at utk.edu> wrote:
> That's exactly what I'm looking for. Thanks so much for taking the time
> to do it that way.
>
> On the redundancy issue, I think SAS checks the "else if" condition only
> if the original "if" is false. The check for f when not m I put in only
> to exclude missing values for gender.
>
> Thanks!!
> Bob
>
> -----Original Message-----
> From: Gabor Grothendieck [mailto:ggrothendieck at gmail.com]
> Sent: Saturday, November 25, 2006 7:37 AM
> To: Muenchen, Robert A (Bob)
> Cc: r-help at stat.math.ethz.ch
> Subject: Re: [R] Multiple Conditional Tranformations
>
> Firstly your outline does not check once, it checks twice.  First it
> check for "m" and then it redundantly checks for "f".  On the other
> hand the two variations in my post do check once.
>
> Although substantially longer than the solutions in my prior posts,
> if you want the style shown in your post try this:
>
> mydata2 <- cbind(mydata, score1 = 0, score2 = 0)
> is.m <- mydata$gender == "m"
>
> mydata2[is.m, ] <- transform(mydata[is.m, ],
>   score1 = 3 * q1 + q2,
>   score2 = 3.5 * q1 + q2
> )
>
> mydata2[!is.m,] <- transform(mydata2[!is.m, ],
>   score1 = 2 * q1 + q2,
>   score2 = 2.5 * q1 + q2
> )
>
> On 11/25/06, Muenchen, Robert A (Bob) <muenchen at utk.edu> wrote:
> > Gabor,
> >
> > Those are handy variations! Perhaps my brain in still in SAS mode on
> > this. I'm expecting something like the code below that checks for male
> > only once, checks for female only when not male (skipping NAs) and
> does
> > all formulas under the appropriate conditions. The formulas I made up
> to
> > keep the code short & may not be as easily modified to let the logical
> > 0/1 values fix them.
> >
> > if gender=="m" then do;
> >  Score1=...
> >  Score2=
> >  ...
> > end;
> > else if gender=="f" then do;
> >  Score1=...
> >  Score2=
> >  ...
> > end;
> >
> > R may not have anything quite like that. R certainly has many other
> > features that SAS lacks.
> >
> > Thanks,
> > Bob
> >
> > =========================================================
> > Bob Muenchen (pronounced Min'-chen), Manager
> > Statistical Consulting Center
> > U of TN Office of Information Technology
> > 200 Stokely Management Center, Knoxville, TN 37996-0520
> > Voice: (865) 974-5230
> > FAX: (865) 974-4810
> > Email: muenchen at utk.edu
> > Web: http://oit.utk.edu/scc,
> > News: http://listserv.utk.edu/archives/statnews.html
> > =========================================================
> >
> >
> > -----Original Message-----
> > From: Gabor Grothendieck [mailto:ggrothendieck at gmail.com]
> > Sent: Saturday, November 25, 2006 12:39 AM
> > To: Muenchen, Robert A (Bob)
> > Cc: r-help at stat.math.ethz.ch
> > Subject: Re: [R] Multiple Conditional Tranformations
> >
> > And here is a variation:
> >
> > transform(mydata,
> >   score1 = (2 + (gender == "m")) * q1 + q2,
> >   score2 = score1 + 0.5 * q1
> > )
> >
> > or
> >
> > transform(
> >   transform(mydata, score1 = (2 + (gender == "m")) * q1 + q2),
> >   score2 = score1 + 0.5 * q1
> > )
> >
> >
> > On 11/25/06, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> > > Try this:
> > >
> > >
> > > transform(mydata,
> > >   score1 = (2   + (gender == "m")) * q1 + q2,
> > >   score2 = (2.5 + (gender == "m")) * q1 + q2
> > > )
> > >
> > >
> > > On 11/24/06, Muenchen, Robert A (Bob) <muenchen at utk.edu> wrote:
> > > > Mark,
> > > >
> > > > I finally got that approach to work by spreading the logical
> > condition
> > > > everywhere. That gets the lengths to match. Still, I can't help
> but
> > > > think there must be a way to specify the logic once per condition.
> > > >
> > > > Thanks,
> > > > Bob
> > > >
> > > > mydata$score1<-numeric(mydata$q1) #just initializing.
> > > > mydata$score2<-numeric(mydata$q1)
> > > > mydata$score1<-NA
> > > > mydata$score2<-NA
> > > > mydata
> > > >
> > > > mydata$score1[mydata$gender == "f"]<-
> > 2*mydata$q1[mydata$gender=="f"] +
> > > >
> > > >  mydata$q2[mydata$gender=="f"]
> > > > mydata$score2[mydata$gender ==
> > "f"]<-2.5*mydata$q1[mydata$gender=="f"] +
> > > >
> > > >  mydata$q2[mydata$gender=="f"]
> > > > mydata$score1[mydata$gender ==
> "m"]<-3*mydata$q1[mydata$gender=="m"]
> > +
> > > >  mydata$q2[mydata$gender=="m"]
> > > > mydata$score2[mydata$gender ==
> > "m"]<-3.5*mydata$q1[mydata$gender=="m"] +
> > > >
> > > >  mydata$q2[mydata$gender=="m"]
> > > > mydata
> > > >
> > > > =========================================================
> > > > Bob Muenchen (pronounced Min'-chen), Manager
> > > > Statistical Consulting Center
> > > > U of TN Office of Information Technology
> > > > 200 Stokely Management Center, Knoxville, TN 37996-0520
> > > > Voice: (865) 974-5230
> > > > FAX: (865) 974-4810
> > > > Email: muenchen at utk.edu
> > > > Web: http://oit.utk.edu/scc,
> > > > News: http://listserv.utk.edu/archives/statnews.html
> > > > =========================================================
> > > >
> > > >
> > > > -----Original Message-----
> > > > From: Leeds, Mark (IED) [mailto:Mark.Leeds at morganstanley.com]
> > > > Sent: Friday, November 24, 2006 8:45 PM
> > > > To: Muenchen, Robert A (Bob)
> > > > Subject: RE: [R] Multiple Conditional Tranformations
> > > >
> > > > I'm not sure if I understand your question but I don't think you
> > need
> > > > iflelse statements.
> > > >
> > > > myscore<-numeric(q1) ( because I'm not sure how to initialize a
> list
> > so
> > > > initialize a vector with q1 elements )
> > > >
> > > > myscore<-NA ( I think this should set all the values in myscore to
> > NA )
> > > > myscore[mydata$gender == f]<-2*mydata$q1 + mydata$q2
> > > > myscore[mydata$gender == m]<-3*mydata$q1 + mydata$q2
> > > >
> > > > the above should do what you do in the first part of your code but
> I
> > > > don't know if that was your question ?
> > > > also, it does it making myscore a vector because I didn't know how
> > to
> > > > initialize a list.
> > > > Someone else may goive a better solution. I'm no expert.
> > > >
> > > >
> > > > -----Original Message-----
> > > > From: r-help-bounces at stat.math.ethz.ch
> > > > [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Muenchen,
> > Robert
> > > > A (Bob)
> > > > Sent: Friday, November 24, 2006 8:27 PM
> > > > To: r-help at stat.math.ethz.ch
> > > > Subject: [R] Multiple Conditional Tranformations
> > > >
> > > > Greetings,
> > > >
> > > >
> > > >
> > > > I'm learning R and I'm stuck on a basic concept: how to specify a
> > > > logical condition once and then perform multiple transformations
> > under
> > > > that condition. The program below is simplified to demonstrate the
> > goal.
> > > > Its results are exactly what I want, but I would like to check the
> > > > logical state of gender only once and create both (or any number
> of)
> > > > scores at once.
> > > >
> > > >
> > > >
> > > > mystring<-
> > > >
> > > > ("id,group,gender,q1,q2,q3,q4
> > > >
> > > > 01,1,f,2,2,5,4
> > > >
> > > > 02,2,f,2,1,4,5
> > > >
> > > > 03,1,f,2,2,4,4
> > > >
> > > > 04,2,f,1,1,5,5
> > > >
> > > > 05,1,m,4,5,4,
> > > >
> > > > 06,2,m,5,4,5,5
> > > >
> > > > 07,1,m,3,3,4,5
> > > >
> > > > 08,2,m,5,5,5,4")
> > > >
> > > >
> > > >
> > > >
> >
> mydata<-read.table(textConnection(mystring),header=TRUE,sep=",",row.name
> > > > s="id")
> > > >
> > > > mydata
> > > >
> > > >
> > > >
> > > > #Create score1 so that it differs for males and females:
> > > >
> > > > mydata$score1 <- ifelse( mydata$gender=="f" ,
> > > >
> > > >   (mydata$score1 <- (2*mydata$q1)+mydata$q2),
> > > >
> > > >   ifelse( mydata$gender=="m",
> > > >
> > > >      (mydata$score1 <- (3*mydata$q1)+mydata$q2), NA )
> > > >
> > > >   )
> > > >
> > > > mydata
> > > >
> > > >
> > > >
> > > > #Create score2 so that it too differs for males and females:
> > > >
> > > > mydata$score2 <- ifelse( mydata$gender=="f" ,
> > > >
> > > >   (mydata$score2 <- (2.5*mydata$q1)+mydata$q2),
> > > >
> > > >   ifelse( mydata$gender=="m",
> > > >
> > > >      (mydata$score2 <- (3.5*mydata$q1)+mydata$q2), NA )
> > > >
> > > >   )
> > > >
> > > > mydata
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Thanks!
> > > >
> > > > Bob
> > > >
> > > > =========================================================
> > > > Bob Muenchen (pronounced Min'-chen), Manager Statistical
> Consulting
> > > > Center U of TN Office of Information Technology 200 Stokely
> > Management
> > > > Center, Knoxville, TN 37996-0520
> > > > Voice: (865) 974-5230
> > > > FAX: (865) 974-4810
> > > > Email: muenchen at utk.edu
> > > > Web: http://oit.utk.edu/scc <http://oit.utk.edu/scc> ,
> > > > News: http://listserv.utk.edu/archives/statnews.html
> > > > <http://listserv.utk.edu/archives/statnews.html>
> > > > =========================================================
> > > >
> > > >
> > > >
> > > >
> > > >        [[alternative HTML version deleted]]
> > > >
> > > > ______________________________________________
> > > > R-help at stat.math.ethz.ch 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.
> > > > --------------------------------------------------------
> > > >
> > > > This is not an offer (or solicitation of an offer) to buy/sell the
> > > > securities/instruments mentioned or an official confirmation.
> > Morgan
> > > > Stanley may deal as principal in or own or act as market maker for
> > > > securities/instruments mentioned or may advise the issuers.  This
> is
> > not
> > > > research and is not from MS Research but it may refer to a
> research
> > > > analyst/research report.  Unless indicated, these views are the
> > author's
> > > > and may differ from those of Morgan Stanley research or others in
> > the
> > > > Firm.  We do not represent this is accurate or complete and we may
> > not
> > > > update this.  Past performance is not indicative of future
> returns.
> > For
> > > > additional information, research reports and important
> disclosures,
> > > > contact me or see https://secure.ms.com/servlet/cls.  You should
> not
> > use
> > > > e-mail to request, authorize or effect the purchase or sale of any
> > > > security or instrument, to send transfer instructions, or to
> effect
> > any
> > > > other transactions.  We cannot guarantee that any such requests
> > received
> > > > via e-mail will be processed in a timely manner.  This
> communication
> > is
> > > > solely for the addressee(s) and may contain confidential
> > information.
> > > > We do not waive confidentiality by mistransmission.  Contact me if
> > you
> > > > do not wish to receive these communications.  In the UK, this
> > > > communication is directed in the UK to those persons who are
> market
> > > > counterparties or intermediate customers (as defined in the UK
> > Financial
> > > > Services Authority's rules).
> > > >
> > > > ______________________________________________
> > > > R-help at stat.math.ethz.ch 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.
> > > >
> > >
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch 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.
> >
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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