title: Calculate summary statistics and then merge all results into single data.frame
body: <p>I am trying to learn to simplify my code and merge multiple <code>data.frames</code> (>2) simultaneously into a single dataset. First, I would like to calculate the "site" <code>mean</code>, <code>sd</code>, and <code>n</code> (number of "individuals" at each site) for each of the four PCA columns (<code>Morph_PC1</code>, <code>Morph_PC2</code>, ...). Second, merge the results into a single data.frame. Below is sample data and code that I attempted this task.</p>
  
  <p>I realize that there maybe a method that generates a single dataset that does not require merging and this would be great, but I would also like to know how to make the <code>merge_all</code> command from the package <code>reshape</code> to work.</p>
  
  <p>Sample data:</p>
  
  <pre><code>WW_Data &lt;- structure(list(Individual_ID = c("WW_00A_05", "WW_00A_03", "WW_00A_02", 
  "WW_00A_01", "WW_00A_04", "WW_00A_06", "WW_00A_08", "WW_00A_09", 
  "WW_00A_07", "WW_00A_10", "WW_09AB_14", "WW_09AB_09", "WW_09AB_13", 
  "WW_10AD_01", "WW_10AD_09", "WW_10AD_04", "WW_10AD_02", "WW_10AD_03", 
  "WW_10AD_07", "WW_10AD_08"), Site_Name = c("Alnön", "Alnön", 
  "Alnön", "Alnön", "Alnön", "Alnön", "Alnön", "Alnön", "Alnön", 
  "Alnön", "Anjan", "Anjan", "Anjan", "Anjan", "Anjan", "Anjan", 
  "Anjan", "Anjan", "Anjan", "Anjan"), Morph_PC1 = c(-2.08424433316496, 
  -1.85413711191957, -1.67227075271696, -1.0486265729884, -0.809415702756541, 
  -2.81781338129716, -2.08471369525797, -0.183840575363918, -0.753930407169699, 
  0.0719252507535882, 1.02353521593315, 1.34441686821234, 0.755249445355964, 
  -0.564426004755035, 0.720689649641627, -0.243471506156601, -0.245437522679261, 
  -0.69936850894502, 0.9160796809062, 2.2881261039382), Morph_PC2 = c(1.28499189140338, 
  -0.349487815669147, 0.0148183164519594, -1.55929148726881, -0.681590397005219, 
  1.21595114750227, 0.116028310510466, 0.187613229042593, -0.923592436104444, 
  -1.50956083294446, 1.44864057855388, 1.46254159976068, 1.20375736157205, 
  0.174071006609975, -0.722049893415186, 1.03516327411773, 0.808851776990861, 
  -0.928263134752596, -0.175511637463994, -0.389421342417043), 
      Morph_PC3 = c(-0.445087364125436, -0.704903876393893, 0.161983939922481, 
      1.14604411022773, 0.701508422965674, -0.78133408496171, -0.306619974141955, 
      1.05643337302175, 0.163868647932456, -0.673344807228353, 
      -0.337986608605208, -1.01911125040091, 0.258004835638601, 
      -0.648040419259003, -0.196770002944659, 0.614010430132367, 
      0.755886614924319, -0.0631407344114064, -1.28178468134549, 
      0.226362214551239), Morph_PC4 = c(0.0476276463048772, 0.342957387676778, 
      -0.117383887482525, 0.289881853573214, 0.649579005842321, 
      0.600433718752986, 0.295294947111845, -0.293754065807853, 
      -0.43805381119461, 0.520363554131325, -0.393329204345947, 
      -1.05629143416274, -0.370922397397109, 0.115121369773473, 
      0.91445926597504, 0.280048079793911, -0.802245210297552, 
      0.00368405602889952, -0.251898295768711, -0.607995193037228
      )), .Names = c("Individual_ID", "Site_Name", "Morph_PC1", 
  "Morph_PC2", "Morph_PC3", "Morph_PC4"), row.names = c(36L, 37L, 
  38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 137L, 138L, 139L, 140L, 
  141L, 142L, 143L, 144L, 145L, 146L), class = "data.frame")
  </code></pre>
  
  <p>The code:</p>
  
  <pre><code>## Calculate statistics for each site ##
  WW_PC1_Mean &lt;- subset(melt(tapply(WW_Data$Morph_PC1,list(WW_Data$Site_Name),mean)), value != FALSE)
  WW_PC1_SD &lt;- subset(melt(tapply(WW_Data$Morph_PC1,list(WW_Data$Site_Name),sd)), value != FALSE)
  WW_PC2_Mean &lt;- subset(melt(tapply(WW_Data$Morph_PC2,list(WW_Data$Site_Name),mean)), value != FALSE)
  WW_Site_SD &lt;- subset(melt(tapply(WW_Data$Morph_PC2,list(WW_Data$Site_Name),sd)), value != FALSE)
  
  ## merge the all the datasets with one command - THIS FAILS!
  WW_Stats &lt;- merge_all(WW_Site_PC1_Mean, WW_Site_PC1_SD, WW_Site_PC2_Mean, by = c("indices"))
  </code></pre>
  
  <p><strong>Edits</strong>:
  Now I have a good result for quickly getting the summary stats into three files, but I still have a problem trying to <code>merge_all</code> (although I am unsure whether I should be using <code>merge_recurse</code> - regardless I get the same error) the results. Here is my attempt:</p>
  
  <pre><code>## Calculate statistics for each site ##
  WW_Site_PC_Mean &lt;- ddply(WW_Data, .(Site_Name), numcolwise(mean))
  colnames(WW_Site_PC_Mean) &lt;- c("Site_Name", "PC1_Mean", "PC2_Mean", "PC3_Mean", "PC4_Mean")
  WW_Site_PC_SD &lt;- ddply(WW_Data, .(Site_Name), numcolwise(sd))
  colnames(WW_Site_PC_Mean) &lt;- c("Site_Name", "PC1_SD", "PC2_SD", "PC3_SD", "PC4_SD")
  WW_Site_PC_N &lt;- count(WW_Data$Site_Name)
  colnames(WW_Site_PC_N) &lt;- c("Site_Name", "PCA_N")
  
  
  ## merge the all the datasets with one command - THIS FAILS!
  WW_Stats &lt;- merge_recurse(WW_Site_PC_Mean, WW_Site_PC_SD, WW_Site_PC_N, by = "Site_Name")
  </code></pre>
  
  <p>Error output:</p>
  
  <pre><code>Error in fix.by(by.x, x) : 
    'by' must specify column(s) as numbers, names or logical
  </code></pre>