Libname AS909OUT "I:\Corso CloneDWH SAS EG"; run; /****************************************************************/ /* ESERCITAZIONE 2 */ /****************************************************************/ *PROCEDURE; data sdo18_1; set AS909OUT.corsosla_sdoreg18; keep ID_ANONIMO_RIC COD_AZIENDA ETA ANNO_COMPETENZA N_GG_DEGENZA IST8 COD_INTERVENTO C_ICD_IX_CM SESSO cod_tipo_drg motivo_ricovero; run; data sdo18_logic; set sdo18_1; if sesso = "M" then sesso_istat=1; else if sesso = "F" then sesso_istat=2; if 0<=eta<=20 then eta_cl=1; else if 21<=eta<=40 then eta_cl=2; else if 41<=eta<=60 then eta_cl=3; else if 61<=eta<=80 then eta_cl=4; else if eta >80 then eta_cl=5; *1° esempio; if sesso="F" and eta < 25 then giov=1; *2° esempio; if sesso="F" and eta < 25 then giov1=1; else giov1=0; *3° esempio; if sesso="F" or eta < 25 then giov2=1; else giov2=0; *4° esempio; if sesso ne "F" or eta >= 25 then giov3=1; else giov3=0; *5° esempio; if 0<=eta<=30 then do; giov4="Si"; eta_cl1=1; end; else if 31<=eta<=60 then do; giov4="No"; eta_cl1=2; end; else if eta > 60 then do; giov4="No"; eta_cl1=3; end; keep id_anonimo_ric sesso sesso_istat eta eta_cl giov giov1 giov2 giov3 giov4 eta_cl1; run; *controllo; proc freq data=sdo18_logic; table sesso*sesso_istat/list missing; table eta_cl*eta/list missing; table sesso*eta*giov/list missing; table sesso*eta*giov1/list missing; table sesso*eta*giov2/list missing; table sesso*eta*giov3/list missing; table eta*giov4*eta_cl1/list missing; run; */ *contents; proc contents data=sdo18_1 ; run; *print; proc print data=sdo18_1 ; run; proc print data=sdo18_1 (obs=20); run; proc print data=sdo18_1 (obs=20); var id_anonimo_ric sesso eta ; run; *sort; * il dataset sdo18_1 non è ordinato per eta, mentre il dataset sdo18_ord_decr è ordinato per età dal valore più grande al valore più piccolo; proc sort data=sdo18_1 out=sdo18_ord_desc; by descending eta ; run; * il dataset sdo18_1 non è ordinato per eta, mentre il dataset sdo18_ord_asc è ordinato per età dal valore più piccolo al valore più grande; proc sort data=sdo18_1 out=sdo18_ord_asc; by eta ; run; *freq; *distribuzione di frequenza di una sola variabile; proc freq data=sdo18_1; table COD_AZIENDA; run; *distribuzione di frequenza di due o più variabili all'interno della stessa procedura; proc freq data=sdo18_1; table sesso eta; run; *distribuzione di frequenza utilizzando opzione list - un modo per controllare se la ricodifica della variabile eta (var continua) nel passo di data è stata correttamente codificata nella variabile eta_cl (variabile categortica); proc freq data=sdo1718_logic; table eta_cl*eta/list missing; run; *distribuzione di frequenza utilizzando opzione list - esempio 1 (persone*ricoveri spiegare); *questa tabella ci fornisce solo le percentuali totali; proc freq data=sdo18_1; table sesso*cod_tipo_drg/list; run; *distribuzione di frequenza a doppia entrata - esempio 1 (persone*ricoveri spiegare); *questa tabella ci fornisce oltre alle percentuali totali, anche lke percentuali di riga e di colonna; proc freq data=sdo18_1; table sesso*cod_tipo_drg; run; *distribuzione di frequenza a doppia entrata - esempio 2 (ricoveri*ricoveri spiegare); *questa tabella ci fornisce solo le percentuali totali; proc freq data=sdo18_1; table motivo_ricovero*cod_tipo_drg /list; run; *distribuzione di frequenza a doppia entrata - esempio 2 (persone*ricoveri spiegare); *questa tabella ha una grafica più comune e ci fornisce oltre alle percentuali totali, anche le percentuali di riga e di colonna; proc freq data=sdo18_1; table motivo_ricovero*cod_tipo_drg; run; *distribuzione di frequenza a doppia entrata - esempio 2 (persone*ricoveri spiegare); *questa tabella ha una grafica più comune e ci fornisce oltre alle percentuali totali, anche le percentuali di riga e di colonna; *che volendo possiamo anche non visualizzare; proc freq data=sdo18_1; table motivo_ricovero*cod_tipo_drg/nopercent norow nocol; run; *proc means; proc means data=sdo18_1; var N_GG_DEGENZA; run; *media di una variabile stratificata per una categorica; proc means data=sdo18_1; class cod_tipo_drg; var N_GG_DEGENZA; run; *n.b normalmente al passo di procedura bisogna arrivare con i dati già pronti, la clausola where è tra le pochissime istruzioni che operano ancora sui dati impiagabili in un passo di procedura; proc means data=sdo18_1; class sesso; var N_GG_DEGENZA; where sesso="F"; run; *media di una variabile stratificata per due categoriche e opzione sum; proc means data=sdo18_1 sum maxdec=2; class sesso cod_tipo_drg; var N_GG_DEGENZA ; run; *controllo; proc freq data=sdo18_1; table sesso*cod_tipo_drg*N_GG_DEGENZA/list missing; run; /* 1 96 1*96 = 96 2 21 2*21 = 42 3 26 3*26 = 78 4 12 4*12 = 48 5 12 5*12 = 60 6 5 6*5 = 30 7 18 7*18 = 126 8 4 8*4 = 32 9 7 9*7 = 63 10 2 10*2 = 20 11 5 11*5 = 55 12 5 12*5 = 60 14 1 14*1 = 14 16 2 16*2 = 32 17 1 17*1 = 17 18 1 18*1 = 18 19 1 19*1 = 19 20 1 20*1 = 20 21 1 21*1 = 21 22 1 22*1 = 22 26 2 26*2 = 52 31 1 31*1 = 31 34 2 34*2 = 68 41 1 41*1 = 41 43 1 43*1 = 43 52 1 52*1 = 52 --------- somma 1160 */ /*esempio if-then e else if then data grades; input name $ gpa; if gpa>=3.5 then gpagroup = "Excellent Grades"; if gpa>=3.0 then gpagroup = "Good"; if gpa >= 2.5 then gpagroup = "Satisfactory"; cards; Ann 3.7 Bart 2.9 Cecil 3.5 Denise 4.0 Emily 2.5 Frank 3.6 ; run; proc print data=grades; run; data grades1; input name $ gpa; if gpa>=3.5 then gpagroup = "Excellent Grades"; else if gpa>=3.0 then gpagroup = "Good"; else if gpa >= 2.5 then gpagroup = "Satisfactory"; cards; Ann 3.7 Bart 2.9 Cecil 3.5 Denise 4.0 Emily 2.5 Frank 3.6 ; run; proc print data=grades1; run; */