library(scales)
library(ggplot2)
library(reshape2)

DT.melted <- as.data.table(melt(DT.merged, id.vars=keyCols))
setcolorderpt(DT.melted, "variable")
DT.melted[, month := as.Date(sprintf("%s-%s-01", year, month))]
setkeyv(DT.melted, c("variable", keyCols))

# [1] unique_users       gross              total_units        gross_per_unit    
# [5] gross_per_user     avg_units_per_user

vars.all <- DT.melted[, levels(variable)]
vars.gross <- grep("gross", vars.all, value=TRUE, ignore.case=TRUE)
vars.units <- grep("units", vars.all, value=TRUE, ignore.case=TRUE)
vars.users <- c("unique_users")


DT.melted[, "Measured By" := "Raw Count"]
DT.melted[.(grep("_per_user", vars.all, value=TRUE)), "Measured By" := "Per User" ]
DT.melted[.(grep("_per_unit", vars.all, value=TRUE)), "Measured By" := "Per Unit" ]

DT.melted[, "Measurement" := "Unique Users"]
DT.melted[.(vars.gross), "Measurement" := "Gross Revenue"]
DT.melted[.(vars.units), "Measurement" := "Streams/Downloads"]



gross <- c(vars.gross, vars.users)
units <- c(vars.units, vars.users)

## need a shape list with names
{
ggplot() + 
    geom_line (data=DT.melted[], aes(x=month, y=value, shape=`Measurement`, color=`Measured By`)) + 
    geom_point(data=DT.melted[], aes(x=month, y=value, shape=`Measurement`, color=`Measured By`)) + 
    scale_y_log10() + theme(axis.text=element_text()) + 
    facet_grid(`Measured By`~storename)
}



number of tracks per user per store


  ## S3 method for class 'data.frame'
 melt(data, id.vars, measure.vars,
    variable.name = "variable", ..., na.rm = FALSE,
    value.name = "value")
Arguments

data  
data frame to melt

id.vars 
vector of id variables. Can be integer (variable position) or string (variable name)If blank, will use all non-measured variables.

measure.vars  
vector of measured variables. Can be integer (variable position) or string (variable name)If blank, will use all non id.vars

variable.name 
name of variable used to store measured variable names

value.name  
name of variable used to store values

na.rm 
Should NA values be removed from the data set? This will convert explicit missings to implicit missings.

... 
further arguments passed to or from other methods.