# [R] Crosstab with Average and Count

David L Carlson dcarlson at tamu.edu
Fri Jul 20 15:53:36 CEST 2012

```There are lots of possibilities. Here's one using only xtabs():

dframe <- na.omit(data.frame(x, y, z))
zsum <- xtabs(z~x+y, dframe)
zcount <- xtabs(~x+y, dframe)
zmean <- ifelse(is.nan(zsum/zcount), 0, zsum/zcount)

----------------------------------------------
David L Carlson
Associate Professor of Anthropology
Texas A&M University
College Station, TX 77843-4352

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of Marc Schwartz
> Sent: Friday, July 20, 2012 8:41 AM
> To: vioravis
> Cc: r-help at r-project.org
> Subject: Re: [R] Crosstab with Average and Count
>
> On Jul 20, 2012, at 5:30 AM, vioravis wrote:
>
> > I have the following data:
> >
> > x <- as.factor(c(1,1,1,2,2,2,3,3,3))
> > y <- as.factor(c(10,10,10,20,20,20,30,30,30))
> > z <- c(100,100,NA,200,200,200,300,300,300)
> >
> > I could create the cross tab of x and y with Sum of z as its elements
> using
> > the xtabs function as follows:
> >
> > # X Vs. Y with Sum Z
> >
> > xtabs(z ~ x + y)
> >
> >   y
> > x    10  20  30
> >  1 200   0   0
> >  2   0 600   0
> >  3   0   0 900
> >
> > How do I replace the sum with average and count so that I can get the
> > following outputs??
> >
> > # X Vs. Y with Average of Z
> >   y
> > x      10  20  30
> >  1    100 0   0
> >  2    0   200 0
> >  3    0   0   300
> >
> > # X Vs. Y with Count Z
> >  y
> > x    10  20  30
> > 1    2   0   0
> > 2    0   3   0
> > 3    0   0   3
> >
> > Would appreciate any help on these? Thank you.
> >
> > Ravi
>
>
> You can use ?tapply, albeit you will get NA's rather than 0's:
>
> > tapply(z,  list(x, y), mean, na.rm = TRUE)
>    10  20  30
> 1 100  NA  NA
> 2  NA 200  NA
> 3  NA  NA 300
>
>
> > tapply(z,  list(x, y), function(x) sum(!is.na(x)))
>   10 20 30
> 1  2 NA NA
> 2 NA  3 NA
> 3 NA NA  3
>
>
> Regards,
>
> Marc Schwartz
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help