###############################################
# SHINY Explorer - dt conversion to fst format
###############################################
#===== LOAD PACKAGES ------------------------------------------------------------------------------------------------------------
library(fst)
library(RMySQL)
library(data.table)
#===== FUNCTIONS ----------------------------------------------------------------------------------------------------------------
# recode multiple fields as ordered factors, using themselves or the lookup table as reference for the labels/levels
recode.factors <- function(dt, flds, lkps = FALSE){
for(fn in flds){
if(lkps){
lk <- sub('X', '', fn)
lvls <- lookups[domain_id == lk, lookup_id ]
lbls <- lookups[domain_id == lk, description ]
} else {
lvls <- sort(unique(dt[[fn]]))
lvls <- lvls[!(lvls %in% c(NA))]
lbls <- lvls
}
dt[, (fn) := factor(dt[[fn]], levels = lvls, labels = lbls, ordered = TRUE) ]
}
}
#===== MAIN DATASET --------------------------------------------------------------------------------------------------------------
# Load Data
db_conn <- dbConnect(MySQL(), group = 'shiny', dbname = audit)
lookups <- suppressWarnings(data.table(dbGetQuery(db_conn, 'SELECT * FROM lookups WHERE domain_id != 9') ) )
vars <- suppressWarnings(data.table(dbReadTable(db_conn, 'vars') ) )
calendar <- suppressWarnings(data.table(dbReadTable(db_conn, 'calendar') ) )
dt <- suppressWarnings(data.table(dbReadTable(db_conn, 'shinyexp_dataset'), key = 'HSP_id' ) )
dbDisconnect(db_conn)
db_conn <- dbConnect(MySQL(), group = 'shiny', dbname = 'common')
centres <- suppressWarnings(data.table(dbGetQuery(db_conn, paste('SELECT * FROM centres WHERE', audit)), key = 'HSP_id') )
dbDisconnect(db_conn)
# Add Hospitals info
flds2update <- c('HSP_id', 'HSP', 'OA', 'CCG_id', 'CCG', 'LAT_id', 'LAT', 'NHSR_id', 'NHSR', 'CCR_id', 'CCR', 'CTRY_id', 'CTRY')
dt <- dt[centres[, flds2update, with = FALSE] ]
recode.factors(dt, flds2update)
# Add Calendar info: date.xxx => date formats, datec.xxx => character/factor formats
setkey(dt, 'datefield')
dt <- calendar[, .(
datefield = DATEd,
date.day = as.Date(as.character(DATEd), '%Y%m%d'), datec.day = DATEd5, day_nid = dayOfMonth,
date.week = as.Date(DATEw5, '%d %b %y'), datec.week = DATEw5,
date.month = as.Date(paste0(DATEm, '01'), '%Y%m%d'), datec.month = DATEm1, daten.month = DATEm,
date.quarter = as.Date(
paste0(
substr(quartern, 1, 4),
ifelse(substr(quartern, 5, 5) == 4, '', '0'),
as.numeric(substr(quartern, 5, 5)) * 3,
'01'
), '%Y%m%d'
), datec.quarter = quarter,
date.year = year, datec.year = as.character(year)
), keyby = DATEd][dt][, DATEd := NULL]
dt <- dt[!is.na(datefield)]
dt[, month_id := as.numeric(format(date.day, "%m")) ]
flds2update <- c('datec.year', 'datec.quarter', 'datec.month', 'datec.week', 'datec.day')
recode.factors(dt, flds2update)
dt[, day_lg := factor(day_id, levels = lookups[domain_id == 200091, lookup_id ], labels = lookups[domain_id == 200091, description ], ordered = TRUE )]
dt[, day_st := factor(day_id, levels = lookups[domain_id == 200092, lookup_id ], labels = lookups[domain_id == 200092, description ], ordered = TRUE )]
dt[, daypart := factor(daypart, levels = lookups[domain_id == 200095, lookup_id ], labels = lookups[domain_id == 200095, description ], ordered = TRUE )]
dt[, month_lg := factor(month_id, levels = lookups[domain_id == 200093, lookup_id ], labels = lookups[domain_id == 200093, description ], ordered = TRUE )]
dt[, month_st := factor(month_id, levels = lookups[domain_id == 200094, lookup_id ], labels = lookups[domain_id == 200094, description ], ordered = TRUE )]
# Factors and labels LOGICAL (Yes-No) and CATEGORICALS
flds2update <- vars[nature %in% c('CAT', 'LGC') & is_active == 1, lookup_id]
recode.factors(dt, flds2update, TRUE)
#===== CONSULTANTS --------------------------------------------------------------------------------------------------------------
if(has_consultants){
# Load audit specific
db_conn <- dbConnect(MySQL(), group = 'shiny', dbname = audit)
pc <- suppressWarnings(data.table(dbGetQuery(db_conn, 'SELECT proc_id, consultant_id, responsibility FROM procedures_consultants WHERE is_valid'), key = 'proc_id') )
dbDisconnect(db_conn)
# Load common
db_conn <- dbConnect(MySQL(), group = 'shiny', dbname = 'common')
cons <- suppressWarnings(data.table(dbReadTable(db_conn, 'consultants'), key = 'consultant_id' ) )
dbDisconnect(db_conn)
# Recode
cons[, gender := factor(gender, levels = c('M', 'W'), labels = c('Male', 'Female'))]
recode.factors(cons, 'qualification')
cons[, regStatus := factor(regStatus, levels = lookups[domain_id == 10010, lookup_id ], labels = lookups[domain_id == 10010, description ], ordered = TRUE )]
}
#===== SAVE fts DATA ------------------------------------------------------------------------------------------------------------
write.fst(dt, paste0(data.path, audit, '_dt.fst'), 100 )
#===== CLEAN AND EXIT -----------------------------------------------------------------------------------------------------------
rm(list = ls())
gc()
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎