[R] tapply with cbinded x
Petr PIKAL
petr.pikal at precheza.cz
Tue Jun 16 13:26:35 CEST 2009
Hi
r-help-bounces at r-project.org napsal dne 16.06.2009 12:45:04:
> Stefan Uhmann wrote:
> > Dear List,
> >
> > why does this not work?
> >
> > df <- data.frame(var1 = c(3,2,1), var2 = c(6,5,4), var3 = c(9,8,7),
> > fac = c('A', 'A', 'B'))
> > tapply(cbind(df$var1, df$var2, df$var3), df$fac, mean)
>
> because
>
> length(cbind(df$var1, df$var2, df$var3))
> # 9
This is the problem with cbinding anything. You will get matrix which is
basically a vector with dimensions
> dim(cbind(df$var1, df$var2, df$var3))
[1] 3 3
>
> length(df$fac)
> # 3
>
> and that's enough for it not to work, as far as i understand what
> ?tapply says.
>
> here's another question: why this *does* work (or "work"):
>
> d = data.frame(a=1:3, b=1:3, c=1:3)
> f = factor(1:3)
>
> tapply(d, f, c)
> # no issues
Tapply does not check the arguments, it just check if d and f has the same
length, which in your case is true.
> length(d)==3
[1] TRUE
>
and the aggregation function itself is
lapply(split(d, f), c)
Which is in your case also valid although not very meaningful.
Maybe the help page shall state that with data.frame as first argument you
can get unexpected results. However I would expect that help page shows
you recommended way of doing things not to warn you about any possible
combination of actions.
Regards
Petr
>
> although
>
> is.atomic(d)
> # FALSE
>
> and ?tapply says:
>
> " X: an atomic object, typically a vector."
>
> note the 'atomic'.
>
> vQ
>
> ______________________________________________
> 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