On 11-10-24 7:16 PM, Hadley Wickham wrote:
On Mon, Oct 24, 2011 at 5:39 AM, Duncan Murdoch
<murdoch.dun...@gmail.com> wrote:
Suppose I have data like this:
A<- sample(letters[1:3], 1000, replace=TRUE)
B<- sample(LETTERS[1:2], 1000, replace=TRUE)
x<- rnorm(1000)
I can get a table of means via
tapply(x, list(A, B), mean)
and I can add the marginal means to this using cbind/rbind:
main<- tapply(x, list(A,B), mean)
Amargin<- tapply(x, list(A), mean)
Bmargin<- tapply(x, list(B), mean)
rbind(cbind(main, all=Amargin),all=c(Bmargin, mean(x)))
But this is tedious. Has some package got some code that makes this easier?
Have a look at reshape2::add_margins - it's not super efficient, but I
think cool because it works for arbitrarily many dimensions.
Hadley
I actually was hoping for something more like what I remember vaguely
from SAS PROC TABULATE, which I haven't used in about 20 years. Anyway,
I decided to go ahead and write it; it's fun enough that I'll probably
put it on CRAN eventually. Here's what it currently gives:
> tabular( x*mean*(A+1) ~ (B+1) )
B
A B All
x mean A a 0.05058 0.02308 0.036279
b 0.02878 0.01188 0.020953
c 0.06869 -0.08192 -0.003033
All 0.04906 -0.01511 0.017875
and here's a more elaborate example:
> example(tabular)
tabulr> tabular( (Species + 1) ~ (n=1) + Format(digits=2)*
tabulr+ (Sepal.Length + Sepal.Width)*(mean + sd), data=iris )
Sepal.Length Sepal.Width
n mean sd mean sd
Species setosa 50 5.01 0.35 3.43 0.38
versicolor 50 5.94 0.52 2.77 0.31
virginica 50 6.59 0.64 2.97 0.32
All 150 5.84 0.83 3.06 0.44
Duncan Murdoch
______________________________________________
R-help@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.