title: Apply several summary functions on several variables by group in one call
body: <p>I have the following data frame</p>
  
  <pre><code>x &lt;- read.table(text = "  id1 id2 val1 val2
  1   a   x    1    9
  2   a   x    2    4
  3   a   y    3    5
  4   a   y    4    9
  5   b   x    1    7
  6   b   y    4    4
  7   b   x    3    9
  8   b   y    2    8", header = TRUE)
  </code></pre>
  
  <p>I want to calculate the mean of val1 and val2 grouped by id1 and id2, and simultaneously count the number of rows for each id1-id2 combination. I can perform each calculation separately: </p>
  
  <pre><code># calculate mean
  aggregate(. ~ id1 + id2, data = x, FUN = mean)
  
  # count rows
  aggregate(. ~ id1 + id2, data = x, FUN = length)
  </code></pre>
  
  <p>In order to do both calculations in one call, I tried</p>
  
  <pre><code>do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))
  </code></pre>
  
  <p>However, I get a garbled output along with a warning:</p>
  
  <pre><code>#     m   n
  # id1 1   2
  # id2 1   1
  #     1.5 2
  #     2   2
  #     3.5 2
  #     3   2
  #     6.5 2
  #     8   2
  #     7   2
  #     6   2
  # Warning message:
  #   In rbind(id1 = c(1L, 2L, 1L, 2L), id2 = c(1L, 1L, 2L, 2L), val1 = list( :
  #   number of columns of result is not a multiple of vector length (arg 1)
  </code></pre>
  
  <p>I could use the plyr package, but my data set is quite large and plyr is very slow (almost unusable) when the size of the dataset grows.</p>
  
  <p>How can I use <code>aggregate</code> or other functions to perform several calculations in one call?</p>