I took _Getting and Cleaning Data_ a second time because I wanted to do the Signature Track thing, but didn't pay them in time, so I'm taking it again.
Also, my take on the project was very hackish in places.  This version cleans up my first take on this exercise.
X <- do.call(rbind, X_means) merges the split dataframes back together rather than an ugly loop.
It uses an lapply() with a call to data.table() in it to build the column means now instead of an ugly loop and verbose data shape mangling.