[R] a vectorized solution to some simple dataframe math?
Petr PIKAL
petr.pikal at precheza.cz
Mon Mar 29 08:20:24 CEST 2010
Hi
r-help-bounces at r-project.org napsal dne 27.03.2010 11:53:30:
> Hi:
>
> Does this do what you want?
>
> # Create some fake data...
>
> df <- data.frame(id = factor(rep(c('cell1', 'cell2'), each = 10)),
> cond = factor(rep(rep(c('A', 'B'), each = 5), 2)),
> time = round(rnorm(20, 350, 10), 2))
>
> # Create a function to subtract each element of a vector from its mean
> f <- function(x) x - mean(x)
> # Load the plyr package, which contains the function ddply():
> library(plyr)
> df2 <- ddply(df, .(id, cond), transform, dev = f(time))
another option is ave
df2 <- data.frame(df, dev=ave(df$time, df$id, df$cond, FUN=f))
Regards
Petr
>
> # output
> > df2
> id cond time dev
> 1 cell1 A 353.01 7.226
> 2 cell1 A 351.06 5.276
> 3 cell1 A 343.59 -2.194
> 4 cell1 A 341.50 -4.284
> 5 cell1 A 339.76 -6.024
> 6 cell1 B 351.18 0.644
> 7 cell1 B 340.53 -10.006
> 8 cell1 B 345.09 -5.446
> 9 cell1 B 347.44 -3.096
> 10 cell1 B 368.44 17.904
> 11 cell2 A 343.48 -3.776
> 12 cell2 A 352.35 5.094
> 13 cell2 A 350.78 3.524
> 14 cell2 A 340.38 -6.876
> 15 cell2 A 349.29 2.034
> 16 cell2 B 364.45 15.524
> 17 cell2 B 354.52 5.594
> 18 cell2 B 350.41 1.484
> 19 cell2 B 345.78 -3.146
> 20 cell2 B 329.47 -19.456
>
> # cell means
> > with(df, aggregate(time, list(id = id, cond = cond), mean))
> id cond x
> 1 cell1 A 345.784
> 2 cell2 A 347.256
> 3 cell1 B 350.536
> 4 cell2 B 348.926
>
> HTH,
> Dennis
>
> On Fri, Mar 26, 2010 at 1:31 PM, Dgnn <sharkbrainpdx at gmail.com> wrote:
>
> >
> > I have a data frame containing the results of time measurements taken
from
> > several cells. Each cell was measured in conditions A and B, and there
are
> > an arbitrary number of measurements in each condition. I am trying to
> > calculate the difference of each measurement from the mean of a given
cell
> > in a given condition without relying on loops.
> >
> > >my.df
> > id cond time
> > 1 cell1 A 343.5
> > 2 cell1 A 355.2
> > ...
> > 768 cell1 B 454.0
> > ...
> > 2106 cell2 A 433.9
> > ...
> >
> > as a first approach I tried:
> >
> > > mews<-aggregate(my.df$time, list(cond=data$id, id=data$cond), mean)
> > id cond time
> > cell1 A 352
> > cell1 B 446
> > cell2 A 244
> > cell2 B ...
> >
> > I then tried to use %in% to match id and cond of mews with my.df, but
I
> > haven't been able to get it to work.
> > Am I on the right track? What are some other solutions?
> >
> > Thanks for any help.
> >
> > jason
> >
> >
> > --
> > View this message in context:
> >
http://n4.nabble.com/a-vectorized-solution-to-some-simple-dataframe-math-
> tp1692810p1692810.html
> > Sent from the R help mailing list archive at Nabble.com.
> >
> > ______________________________________________
> > 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.
> >
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> 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