stop("Not sure this is needed") ------------------------------------------- DB.raw2 <- DB.rawT # [artist %in% c("Jessy Lanza", "Fleshgod Apocalypse")] START.TIME <- proc.time() setkey(DB.raw2, userid, download_datetime) DB.raw2[ , usrFirstTimeOnTrack := FALSE] DB.raw2[ , usrFirstTimeOnUPC := FALSE] DB.raw2[ , usrFirstTimeOnArtist := FALSE] s.t( DB.raw2[DB.raw2[, .I[[1L]], by=list(userid, trackid)]$V1, usrFirstTimeOnTrack := TRUE], "Calc User First, by trackid") s.t( DB.raw2[DB.raw2[, .I[[1L]], by=list(userid, upc)]$V1, usrFirstTimeOnUPC := TRUE], "Calc User First, by upc") s.t( DB.raw2[DB.raw2[, .I[[1L]], by=list(userid, artist)]$V1, usrFirstTimeOnArtist := TRUE], "Calc User First, by artist") END.TIME <- proc.time() cat("\n\nTOTAL TIME:\n") print(END.TIME - START.TIME) setkeyIfNot(DB.raw2, "upc", "download_date") weeks <- c(2, 6) measuringBy1 <- list("upc") # ignoring for now: , "artist") measuringBy2 <- list(NULL, "user_country", "mkt_priority", c("user_country", "mkt_priority")) include <- c("SpotifyAddRan") #, "rel_month") are(DB.raw2) ## THIS IS THE for-loop I AM COMBINING USING expand.grid & lapply # for (W in weeks) # for (M1 in measuringBy1) # for (M2 in measuringBy2) { # DB.raw2[(download_date >= startDate) & (download_date < startDate + (W*7)) # , list( # count = c(.N, sum(usrFirstTimeOnUPC)) # , measuring = paste0(c("total.by.", "unique.by."), paste(c(M1, M2), collapse=".by.")) # , timeframe = sprintf("%02d weeks", W) # ) # , by = c(M1, M2) # ] # } DT.list <- apply(expand.grid(W=weeks, M1=measuringBy1, M2=measuringBy2), 1, function(X) DB.raw2[(download_date >= startDate) & (download_date < startDate + (X$W*7)) , list( count = c(.N, sum(usrFirstTimeOnUPC)) # the sum needs to change depending on W1 , measuring = paste0(c("total.by.", "unique.by."), paste(c(X$M1, X$M2), collapse=".by.")) , timeframe = sprintf("%02d weeks", X$W) ) , by = c(include, X$M1, X$M2) ] ) setattr(DT.list, "names", sapply(DT.list, function(DT) DT[1, gsub("^(total|unique)\\.", "", measuring)])) DT.list[1:5]