# [R] Crosstab with Average and Count

Marc Schwartz marc_schwartz at me.com
Fri Jul 20 15:41:08 CEST 2012

```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

```