******************************************************************************************************; *** Marco GILARDETTI ***; *** A.O.U. Città della Salute e della Scienza (Molinette) ***; *** S.C. Epidemiologia dei Tumori - CPO U ed SSD Epidemiologia Clinica e Valutativa - CPO ***; *** ***; *** ***; *** Accesso e utilizzo del patrimonio informativo sanitario pseudonimizzato ***; *** tramite l’ambiente CloneDWH su piattaforma SAS Enterprise Guide ***; *** ***; *** MODULO 9: FORMATI, DATE E ORE ***; *** ***; ******************************************************************************************************; ******************************************************************************************************; *** FORMATI ***; ******************************************************************************************************; data sdo18; set as909out.corsosla_sdoreg18; PESO_BAMBINO_KG = COD_PESO_ALLA_NASCITA / 1000; * <--- esprimiamo il peso in Kg; if PESO_BAMBINO_KG eq . then delete; * <--- eliminiamo i non-neonati; keep ID_ANONIMO_RIC PESO_BAMBINO_KG; * <--- teniamo solo le variabili che intendiamo consultare; run; * Il risultato non è elegante e contiene un numero disomogeneo di decimali; data sdo18; set as909out.corsosla_sdoreg18; PESO_BAMBINO_KG = COD_PESO_ALLA_NASCITA / 1000; if PESO_BAMBINO_KG eq . then delete; format PESO_BAMBINO_KG 4.2; * <--- Proviamo ad applicare un formato per standardizzare il numero di decimali; keep ID_ANONIMO_RIC PESO_BAMBINO_KG; run; * Il formato può essere cambiato più volte senza alterare i dati grezzi di base; data sdo18; set sdo18; format PESO_BAMBINO_KG 3.1; run; data sdo18; set sdo18; format PESO_BAMBINO_KG 1.0; run; data sdo18; set sdo18; format PESO_BAMBINO_KG 10.8; run; * Per rimuovere il formato, è sufficiente disapplicarlo e si ritorna alla visualizzazione del dato grezzo; data sdo18; set sdo18; format PESO_BAMBINO_KG; * <--- ; run; * Un formato può anche essere applicato direttamente in un passo di procedura; proc freq data=sdo18; tables PESO_BAMBINO_KG; run; proc freq data=sdo18; tables PESO_BAMBINO_KG; format PESO_BAMBINO_KG best3.; * <--- proviamo a far decidere a SAS quale sia la visualizzazione migliore; run; * L'applicazione del formato ha anche l'effetto di raggruppare in output le osservazioni; * Formati non nativamente presenti in SAS possono essere definiti dall'utente; proc format; value $sexnum 'M' = 1 'F' = 2; run; data sdo18; set as909out.corsosla_sdoreg18; run; proc freq data=sdo18; tables SESSO; format SESSO $sexnum.; run; ******************************************************************************************************; *** TRATTAMENTO DELLE DATE E DELLE ORE IN SAS ***; ******************************************************************************************************; * Visualizziamo il contenuto di una SAS DATE; data sdo18; set as909out.corsosla_sdoreg18; keep ID_ANONIMO_RIC D_NASC; run; * Visualizziamo il contenuto di una SAS DATETIME; data sdo18; set as909out.corsosla_sdoreg18; keep ID_ANONIMO_RIC DATA_RICOVERO; run; * Calcolo della durata della degenza in secondi mediante operazioni algebriche; data sdo18; set as909out.corsosla_sdoreg18; DURATA_DEGENZA_SEC = DATA_DIMISSIONE - DATA_RICOVERO; keep ID_ANONIMO_RIC DATA_RICOVERO DATA_DIMISSIONE DURATA_DEGENZA_SEC; run; * Calcolo della durata della degenza in giorni mediante operazioni algebriche; data sdo18; set as909out.corsosla_sdoreg18; DURATA_DEGENZA_SEC = DATA_DIMISSIONE - DATA_RICOVERO; DURATA_DEGENZA_GG = (DATA_DIMISSIONE - DATA_RICOVERO)/(60*60*24); * <--- dividiamo per il numero di secondi in un giorno; format DURATA_DEGENZA_GG 3.0; * <--- è pratico visualizzare il risultato come un numero intero; keep ID_ANONIMO_RIC DATA_RICOVERO DATA_DIMISSIONE DURATA_DEGENZA_SEC DURATA_DEGENZA_GG; run; * Calcolo dell'età alla dimissione in anni mediante operazioni algebriche; data sdo18; set as909out.corsosla_sdoreg18; DATA_DIMISSIONE_GG = datepart(DATA_DIMISSIONE); * <--- eliminiamo la parte d'informazione relativa a ore minuti e secondi; ETA_DIMISSIONE = (DATA_DIMISSIONE_GG - D_NASC)/365.25; * <--- calcoliamo algebricamente l'età; format ETA_DIMISSIONE 3.0; * <--- chiediamo che in uscita sia visualizzata in anni interi; keep ID_ANONIMO_RIC D_NASC DATA_DIMISSIONE DATA_DIMISSIONE_GG ETA_DIMISSIONE; run; * Confronti con valori costanti di data (SAS DATE LITERALS); data sdo18; set as909out.corsosla_sdoreg18; POST_FERRAGOSTO = datepart(DATA_RICOVERO) - '15aug2018'D; keep ID_ANONIMO_RIC POST_FERRAGOSTO; run; ******************************************************************************************************; *** FORMATI SAS DATE E SAS DATETIME ***; ******************************************************************************************************; * Prepariamo una base di dati che contenga due anni e un paio di SAS DATE e SAS DATETIME; data sdo_all; set as909out.corsosla_sdoreg17 as909out.corsosla_sdoreg18; keep ID_ANONIMO_RIC D_NASC DATA_DIMISSIONE; run; * Applichiamo alla SAS DATE un formato "classico" all'americana; proc print data=sdo_all; format D_NASC date7.; run; proc print data=sdo_all; format D_NASC date9.; run; proc print data=sdo_all; format D_NASC date11.; run; * Applichiamo alla SAS DATE un formato tipicamente europeo; proc print data=sdo_all; format D_NASC ddmmyy10.; run; proc print data=sdo_all; format D_NASC ddmmyy8.; run; proc print data=sdo_all; format D_NASC ddmmyy6.; run; * Applichiamo alcuni formati particolarmente utili alla SAS DATETIME; proc print data=sdo_all; format DATA_DIMISSIONE datetime20.; * Formato "classico" all'americana; run; proc print data=sdo_all; format DATA_DIMISSIONE dateampm.; * Utile per distinguere eventi accaduti di mattina o di pomeriggio; run; proc freq data=sdo_all; tables DATA_DIMISSIONE; format DATA_DIMISSIONE dtmonyy5.; * Particolarmente utile per sintetizzare e confrontare i dati; run;