Hello R-help list, I would really appreciate help with my factoring problem. My generated data is this: df <- expand.grid(T=seq(10,80, by=5), conc=rep(c(1, 3, 7), 2)) df$curve <- as.factor(rep(1:6, each=length(seq(10,80, by=5)))) df$counts <- 3*df$T/df$conc + rnorm(df$T,0,2) plot(counts~T, df) What I would like to do add a new column to the dataframe of zeroed data (say df$counts.zeroed). For each curve (designated by factor df$curve) I want to take the value in counts and subtract the minimum value for that curve. However, I don't really have an idea of how to approach this problem and haven't found anything in my searches. And just as a second question, my second line of code assigns the factors, but if there is a nicer way of doing this I would really appreciate knowing how. Thanks for any help! Carly
try this: (uses 'ave')> df <- expand.grid(T=seq(10,80, by=5), conc=rep(c(1, 3, 7), 2)) > df$curve <- as.factor(rep(1:6, each=length(seq(10,80, by=5)))) > df$counts <- 3*df$T/df$conc + rnorm(df$T,0,2) > > plot(counts~T, df) > df$zero <- ave(df$counts, df$curve, FUN = function(x) x - min(x)) > > dfT conc curve counts zero 1 10 1 1 30.4148210 0.000000 2 15 1 1 43.2169594 12.802138 3 20 1 1 64.3876491 33.972828 4 25 1 1 75.2957249 44.880904 5 30 1 1 95.4479888 65.033168 6 35 1 1 103.5814348 73.166614 7 40 1 1 121.0131061 90.598285 8 45 1 1 135.8270827 105.412262 9 50 1 1 152.7179565 122.303136 10 55 1 1 165.2928662 134.878045 11 60 1 1 181.1899238 150.775103 12 65 1 1 197.8600462 167.445225 13 70 1 1 210.0112723 179.596451 14 75 1 1 224.1807064 193.765885 15 80 1 1 237.5717249 207.156904 16 10 3 2 8.2411801 0.000000 17 15 3 2 14.7415660 6.500386 18 20 3 2 20.9944483 12.753268 19 25 3 2 23.4369433 15.195763 On Wed, Apr 25, 2012 at 10:57 AM, Carly Huitema <carly.huitema at gmail.com> wrote:> Hello R-help list, > > I would really appreciate help with my factoring problem. > > My generated data is this: > > df <- expand.grid(T=seq(10,80, by=5), conc=rep(c(1, 3, 7), 2)) > df$curve <- as.factor(rep(1:6, each=length(seq(10,80, by=5)))) > df$counts <- 3*df$T/df$conc + rnorm(df$T,0,2) > > plot(counts~T, df) > > > What I would like to do add a new column to the dataframe of zeroed > data (say df$counts.zeroed). For each curve (designated by factor > df$curve) I want to take the value in counts and subtract the minimum > value for that curve. However, I don't really have an idea of how to > approach this problem and haven't found anything in my searches. > > And just as a second question, my second line of code assigns the > factors, but if there is a nicer way of doing this I would really > appreciate knowing how. > > Thanks for any help! > Carly > > ______________________________________________ > 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.-- Jim Holtman Data Munger Guru What is the problem that you are trying to solve? Tell me what you want to do, not how you want to do it.
David Winsemius
2012-Apr-25 17:17 UTC
[R] transforming data based on factors in a dataframe
On Apr 25, 2012, at 10:57 AM, Carly Huitema wrote:> Hello R-help list, > > I would really appreciate help with my factoring problem. > > My generated data is this: > > df <- expand.grid(T=seq(10,80, by=5), conc=rep(c(1, 3, 7), 2)) > df$curve <- as.factor(rep(1:6, each=length(seq(10,80, by=5))))> df$counts <- 3*df$T/df$conc + rnorm(df$T,0,2) > > plot(counts~T, df) > > > What I would like to do add a new column to the dataframe of zeroed > data (say df$counts.zeroed). For each curve (designated by factor > df$curve) I want to take the value in counts and subtract the minimum > value for that curve.translated to R that request would be something along these minimally tested lines: df$counts.zeroed <- with( df, ave(counts, curve, FUN=function(x){ x- min(x) }) )> However, I don't really have an idea of how to > approach this problem and haven't found anything in my searches. > > And just as a second question, my second line of code assigns the > factors, but if there is a nicer way of doing this I would really > appreciate knowing how.There is a `gl` function that I think creates grouping factors, but I generally use `rep` because I understand it better.> > Thanks for any help! > Carly > > ______________________________________________ > 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.David Winsemius, MD West Hartford, CT