Search code examples
rreshape2summarymelt

Publication-ready summary table from SummarySE function, R


I am trying to create a summary table of the mean ± standard error. So far I have managed to extract the mean and se columns from the SummarySE function, however I am now stuck and can't figure out how to get the column and row names.

Data:

structure(list(TREATMENT = c("A", "A", "A", "B", "B", "B", "C", 
"C", "C", "D", "D", "D", "A", "A", "A", "B", "B", "B", "C", "C", 
"C", "D", "D", "A", "A", "A", "B", "B", "B", "C", "C", "C", "D", 
"D"), TIME = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), `Species 1` = c(1.64963636363636, 
1.6574, 1.58190909090909, 1.6365, 1.75075, 1.83825, 2.247, 1.95557142857143, 
2.35236363636364, 1.82253333333333, 1.37785714285714, 1.37892857142857, 
2.952125, 3.33311111111111, 3.0967, 3.3912, 3.89709090909091, 
3.51207692307692, 6.6176, 8.41072727272727, 7.3625, 7.19133333333333, 
4.88216666666667, 4.770625, 28.371125, 6.8786, 4.10457142857143, 
13.232, 8.66828571428571, 14.6534615384615, 51.7823333333333, 
42.5318333333333, 20.2263333333333, 13.396), `Species 2` = c(2.36021428571429, 
2.30930769230769, 3.01018181818182, 2.0195, 1.97107142857143, 
2.07614285714286, 1.85307142857143, 2.2695, 2.29286666666667, 
1.9504375, 1.95207142857143, 2.2144375, 2.57385714285714, 2.865, 
2.92928571428571, 2.8453, 2.63855555555556, 4.15657142857143, 
2.807375, 3.554, 6.12177777777778, 2.65541666666667, 3.7972, 
1.285, 4.755, 4.271, 2.5925, 2.83158333333333, 4.638, 16.8010833333333, 
13.1841666666667, 20.418, 3.24075, 3.0115), `Species 3` = c(2.1960625, 
2.28214285714286, 3.05583333333333, 2.16986666666667, 2.06655, 
2.54166666666667, 1.81271428571429, 1.89566666666667, 2.3227, 
2.80616666666667, 2.05, 1.97592857142857, 3.44611111111111, 1.745, 
2.9208, 4.6525, 3.89709090909091, 2.69244444444444, 2.7464, 5.93042857142857, 
5.18888888888889, 3.8943125, 4.054, 6.11511111111111, 2.518125, 
5.2216, 5.16908333333333, 2.59, 2.55716666666667, 9.12085714285714, 
31.5835714285714, 17.227, 5.98033333333333, 5.21509090909091), 
`Species 4` = c(2.00981818181818, 2.7604, 3.5535, 2.39085714285714, 
3.00138888888889, 2.835, 2.25311111111111, 3.00791666666667, 
2.55933333333333, 2.13933333333333, 2.331, 2.94761111111111, 
3.66525, 7.304125, 3.14788888888889, 7.37175, 5.1192, 4.46957142857143, 
2.73258333333333, 15.4874166666667, 5.9237, 4.81615384615384, 
3.7743, 8.0213, 28.192, 17.6561111111111, 17.3084375, 7.81390909090909, 
3.849, 9.618, 53.8383, 10.2361111111111, 17.9905454545455, 
5.6655)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-34L), .Names = c("TREATMENT", "TIME", "Species 1", "Species 2", 
"Species 3", "Species 4"))

Attempt:

library(Rmisc)
library(Reshape2)

melt <- melt(example, id=c("TREATMENT", "TIME"), value.name="growth", variable.name = "Species")

x <- summarySE(melt, measurevar = "growth", groupvars = c("TIME", "TREATMENT", "Species") )

xmean<-signif(x[,5],digits=3)

xse<-signif(x[,7],digits=3)

x<-paste(xmean,xse,sep=" \u00b1 ")

x

Produces:

[1] "1.63 ± 0.024"  "2.56 ± 0.226"  "2.51 ± 0.273"  "2.77 ± 0.446"  "1.74 ± 0.0584" "2.02 ± 0.0304" "2.26 ± 0.144"

I have a feeling I am going about this the long way, is there such a thing as a package that creates publication-ready tables? Something like the table-version of ggplot2. I can't seem to find anything.


Solution

  • Hmm, I can't seem to figure out what you're summarizing by. I don't have the Rmisc package, but assuming the answers you're getting are correct, you can just wrap it in a data frame and give each measure a row name:

    d=data.frame(summary=x, row.names=colnames(example)[3:ncol(example)])
    

    Which if, say, you were summarizing by species would look like this:

                    summary
    Species.1  1.852 ± 0.28
    Species.2  2.24 ± 0.338
    Species.3  2.26 ± 0.371
    Species.4 2.708 ± 0.465
    

    EDIT: Since the summarySE output is already a data frame, you just need to create a new column to format the data the way way you want, then reshape it how you want it to look in the end. Here's an example, in keeping with your use of reshape2:

    x$summary = paste(round(x$growth, 3), "\u00b1", round(x$se, 3))
    dcast(x, TIME+TREATMENT~Species, value.var='summary')
    

    Output:

       TIME TREATMENT       Species 1      Species 2     Species 3       Species 4
    1     0         A    1.63 ± 0.024   2.56 ± 0.226 2.511 ± 0.273   2.775 ± 0.446
    2     0         B   1.742 ± 0.058   2.022 ± 0.03 2.259 ± 0.144   2.742 ± 0.182
    3     0         C   2.185 ± 0.119  2.138 ± 0.143  2.01 ± 0.158   2.607 ± 0.219
    4     0         D   1.526 ± 0.148  2.039 ± 0.088 2.277 ± 0.265   2.473 ± 0.244
    5     1         A   3.127 ± 0.111  2.789 ± 0.109 2.704 ± 0.503   4.706 ± 1.308
    6     1         B     3.6 ± 0.153  3.213 ± 0.475 3.747 ± 0.571   5.654 ± 0.879
    7     1         C    7.464 ± 0.52  4.161 ± 1.004 4.622 ± 0.962   8.048 ± 3.832
    8     1         D   6.037 ± 1.155  3.226 ± 0.571  3.974 ± 0.08   4.295 ± 0.521
    9     2         A    13.34 ± 7.54  3.437 ± 1.085 4.618 ± 1.081  17.956 ± 5.825
    10    2         B   8.668 ± 2.635  3.354 ± 0.646 3.439 ± 0.865   9.657 ± 3.993
    11    2         C 36.323 ± 11.159 16.801 ± 2.088 19.31 ± 6.568 24.564 ± 14.638
    12    2         D  16.811 ± 3.415  3.126 ± 0.115 5.598 ± 0.383  11.828 ± 6.163