I realize that you can break this approach as well with a suitably complex expression, but I took it as a challenge: > dat <- data.frame(ASB = c(LETTERS[1:3]), Flow=c(11.51, 9.2, 10.5), > stringsAsFactors=FALSE) > cat <- LETTERS[1:3] > mult <- c("'*'(2," , "'+'(5,", "sqrt(") > sapply(parse(text=paste0(mult[match(dat$ASB, cat)], dat$Flow, ")")), eval) [1] 23.02000 14.20000 3.24037
David -----Original Message----- From: Bert Gunter [mailto:bgunter.4...@gmail.com] Sent: Tuesday, September 15, 2015 4:43 PM To: David L Carlson <dcarl...@tamu.edu> Cc: Peter Alspach <peter.alsp...@plantandfood.co.nz>; r-help@r-project.org Subject: Re: [R] Multiple if function Thanks, David. I would say, not quite. What if the alternatives are: If class = "a" multiply y by 2; If class = "b" add 5 to y; If class = "c" take sqrt(y) (where y is numeric, say) ? Cheers, Bert Bert Gunter "Data is not information. Information is not knowledge. And knowledge is certainly not wisdom." -- Clifford Stoll On Tue, Sep 15, 2015 at 2:11 PM, David L Carlson <dcarl...@tamu.edu> wrote: > You could use match() and avoid ifelse(): > >> dat <- data.frame(ASB = c(LETTERS[1:3]), Flow=c(11.51, 9.2, 10.5), >> stringsAsFactors=FALSE) >> cat <- LETTERS[1:3] >> mult <- c(.1, .15, .2) >> dat$Flow * mult[match(dat$ASB, cat)] > [1] 1.151 1.380 2.100 > > ------------------------------------- > David L Carlson > Department of Anthropology > Texas A&M University > College Station, TX 77840-4352 > > > -----Original Message----- > From: R-help [mailto:r-help-boun...@r-project.org] On Behalf Of Bert Gunter > Sent: Tuesday, September 15, 2015 3:51 PM > To: Peter Alspach > Cc: r-help@r-project.org > Subject: Re: [R] Multiple if function > > ... but this only works if ASBclass is numeric. What if it is a factor > (or even character)? > > One can always finesse factors in simple cases like this, but for 2 > reasons, I don't think it's a good idea. > > 1. One should make use of a factor's API, rather than its internal > integer representation(which, I grant, ain't likely to change); > > 2. For more complicated alternatives (e.g. entirely different > functions depending on the factor value) it won't work anyway. > > For simple cases, ifelse() seems reasonable; but for more alternatives > -- say 10 or 50 -- this becomes too cumbersome (imho). I think the > split and recombine approach then becomes the best option, but maybe > there is some easier, shorter, approach that I am overlooking. Please > correct me if this is the case. > > Best, > Bert > > > > > > > Bert Gunter > > "Data is not information. Information is not knowledge. And knowledge > is certainly not wisdom." > -- Clifford Stoll > > > On Tue, Sep 15, 2015 at 12:23 PM, Peter Alspach > <peter.alsp...@plantandfood.co.nz> wrote: >> Tena koe Maria >> >> It seems you need to multiply Flow by 0.05+ASBClass/20 (i.e., no if calls >> are necessary) >> >> HTH .... >> >> Peter Alspach >> >> -----Original Message----- >> From: R-help [mailto:r-help-boun...@r-project.org] On Behalf Of Maria >> Lathouri >> Sent: Tuesday, 15 September 2015 10:57 p.m. >> To: r-help@r-project.org >> Subject: [R] Multiple if function >> >> Dear all, >> >> I am writing as I would like your help. I have a dataframe with two columns, >> ASB and Flow, where the the first one has values 1, 2 or 3 and the second >> flow data. Something like that: >> ASBclass Flow1 11.51 9.2 >> 2 10.5 >> 3 6.7 ... ... >> I would like to produce a third column named eg. deviation where it would >> get me values based on if ASBclass is 1, multiply Flow by 0.1; if ASBclass >> is 2 then multiply Flow by 0.15 and if ASBclass is 3 then multiply by 0.2. >> >> If (ASBclass=1) { deviation<-Flow*0.1} >> If (ASBclass=2) { deviation<-Flow*0.15}If (ASBclass=1) { >> deviation<-Flow*0.2} I am not sure whether I should add the else function >> and how can I combine these separate functions. >> >> Can anyone help me on that? >> Thank you very much. >> >> Kind regardsMaria >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >> 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. >> >> The contents of this e-mail are confidential and may be subject to legal >> privilege. >> If you are not the intended recipient you must not use, disseminate, >> distribute or >> reproduce all or any part of this e-mail or attachments. If you have >> received this >> e-mail in error, please notify the sender and delete all material >> pertaining to this >> e-mail. Any opinion or views expressed in this e-mail are those of the >> individual >> sender and may not represent those of The New Zealand Institute for Plant >> and >> Food Research Limited. >> ______________________________________________ >> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >> 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@r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.