Sei sulla pagina 1di 30

\\sviluppojava2 sviluppojava sviluppo1008

SAS Base
Loop del data-step

Inizializza PDV

Fine Fine del


Esegue istruzione di lettura del passo di
File ? Data

Esegue istruzione di programma

Scrive l’osservazione nel data set SAS

Variabili
Ci sono due tipi di variabili:
- Alfanumeriche: tutti i numeri, lettere e caratteri speciali da 1 a 32.767 byte (dove 1 byte= 1 carattere)
- Numeriche : numeri in virgola mobile di una lunghezza di 8 byte, di 16-17 cifre.
I nomi possono essere di:
- max 32 caratteri.
- possono essere maiuscoli, minuscoli o misti.
- iniziano con lettere o segni di sottolineatura.
Le date sono in formato numerico dal numero di giorni dal 1 gennaio 1960.
I valori missing sono uno spazio per gli alfanumerici e un punto per i numerici.

I data set sono divisi in parte descrittiva e parte di dati.


I tipi di output SAS principali sono log e ouput.

Sintassi
I commenti in SAS si scrivono:
- *…; per una riga.
- /* …. */ per più righe o commenti in macro.

In un data set le righe sono definite osservazioni e le colonne variabili.


Le istruzioni SAS iniziano con una parola chiave e finiscono con un ; .

Opzioni per cambiare l’aspetto di un prospetto


OPTIONS opzione…

DATE stampa la data e l’ora dell’inizio della sessione SAS nella parte superiore di ogni pagina.

1
NODATE specifica di non stampare la data e l’ora.
LINESIZE=larg. o LS=larg. specifica la dimensione della riga per l’output.
PAGESIZE=n. o PS=n. specifica il numero di righe.

NUMBER stampa i numeri di pagina


NONUMBER non stampa i numeri di pagina
PAGENO=n specifica un numero di pagina iniziale per la prossima pagina in output.

Formati
Per definire il formato di un campo, in maniera permanente se fatto in un data step o temporanea se fatta su
un output.

Format variabile formato;


<$> format<w>.<d>
<$> se c’è il dollaro è un formato alfanumerico
Format = nome del formato
<w> lunghezza del formato
<d> numero di posizioni decimali

Alcuni formati
w.d es. 8.2 formato numerico standard
$w es. $5 formato alfanumerico standard
COMMAw.d es comma9.2 formato numerico con punto
COMMAXw.d es commax9.2 formato numerico con virgola
DOLLARw.d es dollar10.2 formato monetario con dollari e punto
PERCENTw.d es percent10.2 formato percentuale con punto

Esempi
27134.2864 COMMA12.2 27,134.29
27134.2864 COMMAX12.2 27.134,29
27134.2864 12.2 27134.29
27134.2864 DOLLAR12.2 $27,134.29
27134.2864 DOLLARX12.2 $27.134,29
27134.2864 DOLLAR9.2 $27134.29
27134.2864 DOLLAR8.2 27134.29
27134.2864 DOLLAR5.2 27134
27134.2864 DOLLAR4.2 27E3 lui prova sempre a dare un formato.

50000 EURFRITL7.2 €25,82


1 EUROX6.2 €1,00
1 EURO6.2 €1.00
1 EUROITL10.2 1936.27

Date:
MMDDYY6. 101601
MMDDYY8. 10/16/01
MMDDYY10. 10/16/2001
DATE7. 16oct01
DATE9. 16oct2001

0 MMDDYY8. 01/01/60
0 MMDDYY10. 01/01/1960
1 DATE9. 02jan1960
-1 WORDDATE. December 31, 1959
365 DDMMYY10. 31/12/1960
366 WEEKDATE. Sunday, January 1, 1961
2
0 ITADFE9. 01Gen1960
0 ITADFDT16. 01Gen60:00:00:01
1 ITADFDD10. 02/01/1960
-1 ITADFMY7. Dic1959
366 ITADFWDX17. 01 Gennaio 1961
366 ITADFWKX28. Domenica, 01 Gennaio 191

Formato definito dall’utente, non può finire con un numero.


PROC FORMAT;
VALUE nome_formato valore1=’descrizione1’
valore2=’descrizione2’;
etc….
RUN;

PROC FORMAT;
value sesso 1=’Femmina’
2=’Maschio’
Other=’Non codificato’;
RUN;

PROC FORMAT;
value fmtpass low-49=’Sotto’
50-99=’In media’
100-High=’Sopra la media’;
RUN;

PROC FORMAT;
value $voto ‘A’=’Buono’
‘B’-‘D’=’Discreto’
‘E’=Sufficiente’
‘F’=Scarso’
‘I’,’U’=’Vedere docente’;
other=’Non codificato;
RUN;

PROC PRINT DATA=scuola.classe;


FORMAT voto $voto. ;
RUN;

Alcune cose a cui fare attenzione:


1234567 formato 8.0 1234567
1234.567 formato 8.0 1234.567
1234567 formato 8.2 12345.67 ATTENZIONE!
1234.567 formato 8.2 1234.567
In pratica se ci sono decimali viene mantenuto il valore.

Operatori Aritmetici
Somma + sum x+y priorità bassa
Sottrazione - diff x-y priorità bassa
Moltiplicazione * mult x*y priorità media
divisione / divide x/y priorità media
elevamento a potenza ** raise x**y priorità alta
cambio di segno - negative -x priorità alta

Il dato missing è considerato – infinito!!!

3
Funzioni
Nome=funzione(argomento1,argomento2);

SUM(var1,var2, …, varn) somma variabili, sum(.. , ..) e non + per i missing (perché missing è meno
infinito!)
TODAY() prende la data dall’orologio di sistema
MDY(mm,gg,aaaa) utilizza la data che inseriamo per dare la data SAS
DAY(data sas) estrae il giorno da una data SAS e restituisce il valore da 1 a 31
MONTH(data sas) estrae il mese da una data SAS e restituisce il valore da 1 a 12
YEAR(data sas) estrae l’anno da una data SAS e restituisce il valore a 4 cifre
QTR(data sas) estrae il trimestre da una data SAS e restituisce il valore da 1 a 4
WEEKDAY(data sas) estrae il giorno della settimana da una data SAS e restituisce il valore da 1 a
7. Dove 1 è la domenica.
YRDIF(datai,dataf,base) restituisce il numero di anni tra due valori SAS
Datai data inizio
Dataf data fine
Base:
‘ACT/ACT’ o ‘ACTUAL’ utilizza il numero effettivo di giorni
‘30/360’ usa mesi di 30 e anni di 360 giorni
‘ACT/360’ utilizza il numero effettivo di giorni e un anno di 360 giorni
‘ACT/365’ utilizza il numero effettivo di giorni e un anno di 365 giorni
Per i mesi basta moltiplicare il risultato per 12.
INTCK(intervallo,da,a) restituisce il numero di intervalli tra date, ore o date e ore
INTNX(intervallo,iniziare da,n di incremento) incrementa una data/ora
L’intervallo può essere: DAY, WEEKDAY, MONTH, QTR, YEAR, HOUR, MINUTE, SECOND, ETC…

DROP var1 var2 etc… per eliminare le variabili menzionate (se aggiunto ali’istruzione DATA …
drop=…)
KEEP var1 var2 etc… per tenere solo le variabili menzionate
RENAME=(var1=var1_newname) rinomina la variabile

UPCASE(argomento) mette tutto in maiuscolo


LENGTH variabile/i <$> lunghezza definisce la lunghezza di una variabile, che altrimenti prende
la lunghezza del primo campo (es length città $ 11;) Deve
essere però definita prima di utilizzare la variabile.
DELETE cancella la riga su cui si trova il program data vector
(OBS=n) numero di righe da prendere in input
(FIRSTOBS=n) da quale riga iniziare il caricamento
RETAIN l’istruzione impedisce a SAS di re inizializzare la variabile che rimane disponibile
per l’elaborazione successiva
BY l’istruzione consente di elaborare i dati in gruppi
FIRST. assume 1 per la prima osservazione in un gruppo
LAST. assume 1 per l’ultima osservazione in un gruppo
_N_ variabile che conta il numero di iterazioni
SET data-set END=var; oppure INPUT ‘nomefile’ END=var;
- END crea una variabile temporanea che fa da indicatore di fine file, che è sempre a 0 e va a 1 quando è
alla fine file. Nel caso della INPUT l’estrazione dell’ultimo record deve essere una
condizione di output esplicita e non condizionale.
Esempio
DATA _NULL_;
SET prog2.vendmag END=ultima;


IF ultima=1 THEN
PUT ‘Data set: PROG2:VENDMAG’;

4
RUN;

SUBSTR(stringa,inizio,lunghezza) prende solo i caratteri a partire da quello d’inizio per la lunghezza


specificata

SUBSTR(stringa,inizio,<lunghezza>)=valore; sostituisce i caratteri a partire da quello d’inizio con il valore


segnato, se non metto la lunghezza toglie tutti i caratteri dal
punto d’inizio alla fine. La lunghezza della stringa estratta è
quella dell’originale, se non viene tagliata.

RIGHT(stringa) restituisce la stringa allineata a destra


LEFT(stringa) restituisce la stringa allineata a sinistra
LENGTH(stringa) restituisce la lunghezza della stringa
SCAN(stringa,n,delimitatori) restituisce l’n-esima parola di una stringa alfanumerica
dove:
n specifica l’n-esima parola da estrarre, se n è negativo inizia dalla fine
delimitatori definisce i caratteri che delimitano le parole,e può essere qualsiasi carattere o
insieme di caratteri se omesso sono:
spazio . < (+|&!$*);-/,%^ per Windows e Unix
la variabile che viene creata è di 200 byte, se non é definita altrimenti.

|| oppure !! servono per concatenare le stringhe, lasciando però gli spazi presenti nelle stringhe

TRIM(stringa) toglie gli spazi finali, se missing mette uno spazio


TRIMN(stringa) toglie gli spazi finali, se missing mette missing
COMPBL(stringa) toglie gli spazi ripetuti
CAT(stringa1, …, strn) concatena le stringhe
CATT(stringa1, …, strn) concatena le stringhe, toglie spazi finali
CATS(stringa1, …, strn) concatena le stringhe, toglie spazi finali e iniziali
CATX(separatore, stringa1, …, strn) concatena le stringhe, toglie spazi finali e iniziali e inserisce i
separatori
FIND(dest,valore,modificatori,pos. Inizi.) cerca una stringa e ne restituisce la posizione
Modificatori:
I indica se tenere conto o meno delle maiuscole/minuscole
T indica di ignorare gli spazi finali
pos. Inizi. da dove inizia la ricerca, se omesso inizia dall’inizio

INDEX(dest,valore) cerca una stringa e ne restituisce la posizione, se non trova da 0 (è key sensitive)
UPCASE(stringa,”…”) converte tutto in maiuscolo
LOWCASE(stringa,”…”) converte tutto in minuscolo
PROPCASE(stringa,”…”) converte la prima lettera in maiuscolo e le altre in minuscolo
TRANWRD(origine,dest,sostituzione) sostituisce o rimuove tutte le occorrenze di una data stringa

ROUND(argomento,<unità di arrotondamento>) arrotonda all’unita di arrotondamento più vicina, se


non viene data l’unità all’intero più vicino
ROUND(argomento, oppure .1 oppure .01 oppure 10)
CEIL(argomento) restituisce il numero intero più piccolo maggiore o uguale all’argomento
FLOOR(argomento) restituisce il numero intero più grande maggiore o uguale all’argomento
INT(argomento) restituisce la parte intera dell’argomento

SUM(argomento1, argomento2,… argomentoN) totale dei valori


MEAN(argomento1, argomento2,… argomentoN) media dei valori
MIN(argomento1, argomento2,… argomentoN) minimo dei valori
MAX(argomento1, argomento2,… argomentoN) massimo dei valori

5
Conversione
Premessa SAS converte automaticamente un valore alfanumerico in un valore numerico come:
• l’assegnazione a una variabile numerica
• un operazione aritmetica
• il confronto logico con un valore numerico
• una funzione che accetta argomenti numerici
e viceversa, da numerico ad alfanumerico come:
• l’assegnazione a una variabile alfanumerica
• un operazione di concatenazione
• una funzione che accetta argomenti alfanumerici
L’istruzione WHERE non fa alcuna conversione.

INPUT(origine, formato-input); converte valori alfanumerici in valori numerici. La funzione non


restituisce alcun messaggio di conversione nel log. Non si può usare
il nome della variabile di origine per quella di destinazione.
Esempio
DATA conversione;
var_alf1=’32000’;
var_alf2=’32,000’;
var_alf3=’03mag2008’;
var_alf4=’050308’;
var_num1=input(var_alf1,5.);
var_num2=input(var_alf2,comma6.);
var_num3=input(var_alf3,itadfde9.);
var_num4=input(var_alf4,mmddyy6.);
RUN;

PUT(origine, formato); la funzione put converte da numerico ad alfanumerico

Esempio
DATA conversione;
var_alf1=614;
var_alf2=55000;
var_alf3=366;
var_num1=put(var_alf1,$3.);
var_num2=put(var_alf2,eurox7.);
var_num3=put(var_alf3,itadfde9.);
RUN;

PUT ’testo’; scrive il ‘testo’ sul log


PUT var1=; scrive il var1=valore sul log
PUT var1 formato; scrive il var1 con il formato indicato
Esempio
PUT alfavar $quote20. scrive “ QUESTO” , il formato $quotew. scrive un formato
alfanumerico mantenendo gli spazi iniziali
PUT _ALL_; scrive il valore di ogni variabile in questo modo: var1=valore sul log
PUTLOG ’testo’; scrive il ‘testo’ sul log anche se è preceduta anche dall’istruzione FILE
LAG<n>(var1) permette di leggere dati da una posizione precedente (<n>) a quella attualmente
caricata nel PDV, se n è omesso allora è 1
DIF<n>(var1) restituisce la differenza tra un argomento e il suo LAG<n>, se n è omesso allora è 1

Elenchi e convenzioni per più variabili nelle funzioni:


elenchi d’intervalli numerati x1-xn specifica tutte le variabili da x1 a xn.
elenchi d’intervalli nomi x--y specifica tutte le variabili da x a y incluse.
x-numeric-y specifica tutte le variabili numeriche da x a y.

6
x-character-a specifica tutte le variabili alfanumeriche da x1 a xn.
elenchi di prefissi di nomi sum (of RIC:) indica a SAS di calcolare la somma di tutte le variabili che
iniziano con RIC
elenchi di nomi SAS _ALL_ tutte le variabili
_NUMERIC_ tutte le variabili numeriche
_CHARACTER_ tutte le variabili carattere

Per la sintassi funzione(of var1-varn);

Costanti
‘ddmmmyyyy’d definisco una data costante (es ‘14dec2000’d )

Condizioni e cicli
La struttura per impostare una condizione è:

IF condizione THEN istruzione


ELSE condizione THEN istruzione
….

IF espressione THEN DO;


… Istruzioni …
END;
ELSE DO;
… Istruzioni …
END;

IF condizione; è un if di estrazione che prende solo i valori veri per la condizione.

OPERATORI DI CONFRONTO
EQ = uguale
NE <> diverso
GT > maggiore
LT < minore
GE >= maggiore o uguale
LE >= minore o uguale
IN ( …) uguale a un elenco

AND &
OR |
NOT ^

BETWEEN 1000 AND 2000;


CONTAINS ? seleziona le osservazione che includono la sottostringa specificata.

LIKE ‘VALORE%’;
% per un numero indefinito di caratteri
_ per un solo carattere

SOUNDLIKE =* che contiene varianti ortografiche della parola.


IS NULL or IS MISSING seleziona le variabile il cui valore e mancante

LOOP DO
Servono per :
• eseguire calcoli ripetitivi

7
• generare dati
• eliminare codice ridondante
• eseguire codice SAS in base a condizioni

DO variabile=1 TO n <BY incremento>;

Esempi
DO i=1 TO 12; un ciclo da 1 a 12
DO g=2 TO 10 BY 2; un ciclo che segue la serie 2 4 6 8 10
DO k=14 TO 2 BY -2; un ciclo che segue la serie 14 12 10 8 6 4 2
DO m=3.6 TO 3.8 BY .05; un ciclo che segue la serie 3.6 3.65 3.7 3.75 3.8

DO variabile=elemento1 , … , elementon ;
DO mese=’JAN’,’FEB’,’MAR’; 3 volte
DO fib=1,2,3,5,8,13,21; 7 volte
DO i=var1,var2,var3; 3 volte
DO k=test1-test50; 1 volta!!! Fa la sottrazione!!

DO WHILE espressione; le istruzioni sono eseguite quando la condizione è vera


<altre istruzioni>
END;

DO UNTIL espressione; le istruzioni sono eseguite quando la condizione diventa vera, comunque
almeno una volta
END;

La differenza è se la condizione è controllata prima o dopo. Attenzione ai loop infinti per evitarli incrocio
con il DO.

DO variabile=1 TO n <BY incremento>;


WHILE | UNTIL espressione;
<altre istruzioni>
END;

Si possono anche fare loop nidificati.

IMPORTAZIONE DATI
I dati grezzi con campi non in colonne fisse sono chiamati a formato libero. I delimitatori più comuni sono :
spazi, virgole tabulazioni

INPUT var1 $ var n etc…

Per i dati standard, specificare un segno di dollaro, $, dopo il nome della variabile se é alfanumerica, nessun
simbolo se è numerica. Il $ non occorre se la variabile è stata precedentemente definita come alfanumerica.

Per specificare un formato di input usare i :

DATA work.personale;
INFILE ‘file-dati-grezzi’; /*Percorso su qual file puntare*/
INPUT Cognome $ 1-20 Nome $ 21-30 Qualifica $ 36-44 Stipendio 54-59;
/* oppure */
INPUT @1 cod_dip $5. @7 data_ass date9. @17 stipendio 5. ;
/* oppure */
RUN;

8
E’ possibile avere più istruzioni input per ogni singolo passo di data.

@ indice di riga
# indice di colonna

INPUT VAR1 VAR2 VAR3 @ serve per bloccare il PDV e non mantiene il buffer dopo il run
INPUT VAR1 VAR2 VAR3 @@ serve nel caso di input a lista (se usato in input per colonne genera
un loop infinito!!!) mantiene il buffer anche dopo il run.
@ e @@ non vanno usate assieme e @@ non va messa con il MISSOVER.

DLM

INFILE ‘file-dati-grezzi’ DLM=’delimitatore’; Mi permette di definire il tipo di delimitatore del file input,
può essere più di uno.
Esempio INFILE ‘file-dati’ DLM=’,’;

ATTENZIONE
Per impostazione predefinita, se vi sono dati mancanti:
1. SAS legge il record successivo per completare la riga
2. Viene scritta una nota nel log
3. SAS legge la nuova riga e prosegue!

Per evitarlo usare l’opzione: MISSOVER che impedisce a SAS di leggere un nuovo record per completare i
missing, e così i valori mancanti vengono lasciati missing.

MISSOVER consente a SAS di leggere record a lunghezza variabile senza cercare i campi missing nella
riga successiva, ma lasciandoli missing.

TRUNCOVER indica a SAS di non leggere dalla riga successiva quando finisce i dati, ma di assegnare alla
variabile quanto ha letto

/ serve per leggere il record successivo sulla stessa riga del file di import

PAD fa in modo che i file siano tutti della stessa lunghezza riempiendo di spazi quelli più brevi, va usata
solo per i file di lunghezza variabile e non quelli a lunghezza delimitata.

Nel caso di due delimitatori consecutivi SAS li prende come un unico delimitatore, quindi i dati mancanti
dovrebbero essere sempre segnati da un segna posto (. per i numerici e spazio per gli alfanumerici).

DSD delimitatore come virgola

Oppure usare l’opzione DSD che:


• imposta il delimitatore predefinito a una virgola
• tratta i delimitatori consecutivi come mancanti
• consente a SAS di non leggere delimitatori incorporati tra doppi apici

Per lettura di colonne e dati in formato standard: INPUT

Esempio
data work.dfwlax;
INFILE ‘file-dati-grezzi’;
INPUT volo $ 1-3 data $ 4-11 dest $12-14 primaclasse 15-17 turistica 18-20;
run;

9
Formato libero
Quando non si hanno colonne fisse ma variabili separate da delimitatori.

Esempio
data work.partenze;
INFILE ‘partenze.dat’;
INPUT volo $ data : itadfde9. dest :$3. primaclasse turistica;
run;

il segno : segnala che SAS deve leggere da delimitatore a delimitatore.

Procedure e Data Step da conoscere


____________________________________________________________________________

CONTENTS

PROC CONTENTS DATA=data-set-sas;


RUN;

Mi da tutte le informazioni sulla parte descrittiva del data set.

PROC CONTENTS DATA=nome_libreria._ALL_ NODS;


RUN;

Mi permette di stampare tutto il contenuto di una libreria e con l’opzione NODS non stampo la parte
descrittiva.
______________________________________________________________________________

LIBNAME

Per creare una libreria nel percorso specificato.

LIBNAME nome_librerie ‘percorso’ <engine> <opzioni engine>;

esempio
windows, DOS e OS/2
libname prog2 ‘c:\prog2’;

UNIX
libname prog2 ‘/user/prog2’;

z/OS OS/390 batch TSO


libname prog2 ‘/user/prog2’;

esempio

LIBNAME oralib oracle


USER=edu001 utente
PW=edu01 password
PATH=dbnssrv specifica i driver, nome e il data base

… Altre opzioni …
PRESERVE_TAB_NAME=yes/no mantiene spazi, caratteri speciali, minuscole e
maiuscole

10
DBPROMPT=yes/no visualizza una finestra che richiede le informazioni per connettersi al
DBMS
DEFER=yes/no determina quando avverrà la connessione se subito o all’apertura di
una tabella nel DBMS.
… opzioni Oracle …
SCHEMA=educ; specifica su quale schema lavorare
BUFFSIZE=numero positivo intero
Specifica il numero di righe in un singolo recupero. Il valore
predefinito è 250.
RUN;

… opzioni DB2 …
LIBNAME db2lib db2
AUTHID=educ specifica id di autorizzazione
SSID=db2 ID sottosistema
SERVER=server specifica il server
ROWSET_SIZE=numero positivo intero
Specifica il numero di righe in un singolo recupero. Il valore
predefinito è 0, quindi non viene effettuata alcuna operazione di
buffering SAS interna.
RUN;

La tecnologia Open Database Connectivity (ODBC):


• consente agli utenti di trasferire dati tra sistemi software compatibili.
• é stata sviluppata da Microsoft Corporation
• utilizza lo structured Query Language (SQL) come Application Programming Interface (API)
comune per comunicare direttamente con database proprietari.
• Ed è comune a tutti i principali DataBase.

… opzioni ODBC …
LIBNAME xlsdata odbc dsn=payrollmaster;
__________________________________________________________________________

OUTPUT
L’istruzione OUTPUT esplicita scrive il contenuto del PDV in un data set SAS.
IMPORTANTE: l’output implicito (RUN)viene ignorato e SAS aggiunge un’osservazione al data set solo
con l’istruzione di output esplicita.

Esempio
DATA previsione;
DROP num_dip;
SET prog2.crescita;
anno=1;
tot_nuovo=num_dip*(1+aumento);
OUTPUT; /* Da in output il contenuto del PDV */
anno=2;
tot_nuovo=num_dip*(1+aumento);
OUTPUT;
anno=3;
tot_nuovo=num_dip*(1+aumento);
OUTPUT;
RUN;
Per scrivere su più data set basta aggiungere i nomi seguiti dallo spazio:
OUTPUT data1 data2 etc ;

11
Esempio
Data esercito marina aeronautica;
drop tipo;
set prog2.militari;
if tipo eq ‘Esercito’ then
output esercito;
else if tipo eq ‘Marina’ then
output marina;
else if tipo eq ‘Aeronautica’ then
output aeronautica;
run;

Esempio
Data esercito marina aeronautica;
drop tipo;
set prog2.militari;
when (‘Esercito’) then output esercito;
when (‘Marina’) then output marina;
when (‘Aeronautica’) then output aeronatuica;
otherwise;
end;
run;
______________________________________________________________________________

PROC PRINT DATA=data-set-sas;


RUN;

Visualizza i dati di un data-set SAS. Ed è possibile visualizzare:


- Titoli e note a piè di pagina.
- Intestazione di colonne descrittive.
- Valori formattati.
- Totali di colonna.
- Sottototali di colonna.
- Salti di pagina per gruppo.

Opzioni:
VAR nome_variabile;
Mi permette di selezionare le variabili da inserire e l’ordine delle stesse.
Esempio
Proc print data=lai.dati_dip;
var cod_lav cod_dip stipendio;
run;

NOOBS elimina i numeri di riga sul lato sinistro del prospetto.


Esempio
Proc print data=lai.dati_dip noobs;
var cod_lav cod_dip stipendio;
run;

WHERE permette di selezionare osservazioni che soddisfano una determinata condizione.


Esempio
Proc print data=lai.dati_dip noobs;
var cod_lav cod_dip stipendio;
where cod_lav=’PILOTA’;
run;

12
SUM somma i totali di colonna e i sottogruppi nel caso di gruppi.
Esempio
Proc print data=lai.dati_dip noobs;
var cod_lav cod_dip stipendio;
sum stipendio;
run;

ID per eliminare la colonna con il numero di osservazione e inserire la variabile/i da usare al suo
posto.
Esempio
Proc print data=lai.dati_dip noobs;
id cod_lav;
var cod_lav cod_dip stipendio;
sum stipen+dio;
run;

BY per ordinare in base alle variabili;


Esempio
Proc print data=lai.dati_dip noobs;
by cod_lav;
var cod_lav cod_dip stipendio;
sum stipendio;
run;

Usando la stessa variabile per ID e BY:


- la colonna Oss viene eliminata;
- la riga by viene eliminata
- la variabile ID/BY va nella colonna più a sinistra
- il valore ID/BY viene stampato solo all’inizio di ogni gruppo

TITLE1 per inserire il titolo


FOOTNOTE1 per inserire le note a pie di pagina
Fino a un massimo di 10 e in caso di istruzione senza titolo vengono annullati tutti.

LABEL assegna una descrizione a una colonna di max 256 caratteri.


Esempio
Proc print data=lai.dati_dip noobs;
Label cognome=’Cognome’
by cod_lav;
var cod_lav cod_dip stipendio;
sum stipendio;
run;
______________________________________________________________________________

FILE ‘c:\corsocb\winsas\prog1\mioprg.sas’; Salva il programma.

______________________________________________________________________________

PROC SORT

PROC SORT DATA=data-set-sas1 OUT=data-set-sas2;


By <descending> variabili;
RUN;
Ordina le variabili di un data set, senza generare un output, dove in caso di valori mancanti sono considerati i
più piccoli
Opzioni:

13
SUM somma i totali di colonna e i sottogruppi nel caso di gruppi.
Esempio
Proc sort data=data-step1;
by cod_lav;
sum stipendio;
run;

PAGEBY per mettere un salto di pagina dopo ogni sottogruppo.


Esempio
Proc sort data=data-step1;
by cod_lav;
pageby cod_lav;
sum stipendio;
run;

proc sort data = rapporti_dist_&banca._txt_prog_rapp


out=rapporti_dist_&banca._txt
nodupkey dupout=rapporti_dupl_2_&banca._txt;
by prog_rapp COD_RAPP;
run;

nodupkey dupout= per creare una tabella con i duplicati

______________________________________________________________________________

DATA dataset3;
SET dataset1 dataset2;
BY var1; entrambi i data set sono ordinati per la variabile var1
RUN;
Ovviamente i due dataset devono essere entrambi già ordinati sulla var1
_____________________________________________________________________________

PROC DATA=data-set OUT=new data set NLEVELS(per includere il numero di livelli(strati?));


TABLES var1 NOPRINT(non fa mostrare i conteggi); variabili da includere nella ricerca
oppure
_ALL_ NOPRINT per visualizzare i livelli di tutte le variabili senza i conteggi
oppure
TABLES var1 * var2 per calcolare la frequenza delle combinazioni
oppure
TABLES var1 * var2 /CROSSLIST per visualizzare i risultati sottoforma di listato
/NOCUM per non visualizzare la colonna delle cumulate
/SPARSE inserisce anche i dati missing e 0
TITLE ‘qua si inserisce il titolo’;
RUN;
______________________________________________________________________________

PROC MEANS DATA=data-set MAXDEC=n (per definire il numero di posizioni decimali volute):
VAR var1 var2 definisce su quali variabili fare la ricerca
CLASS var1 var2 raggruppa le osservazioni per l’analisi successive (che viene fatta per gruppi)
Fornisce le seguenti statistiche:
N numero di righe con valori non mancanti
MEAN media aritmetica
STD deviazione standard
MIN valore minimo
MAX valore massimo
Posso richiedere anche:

14
RANGE differenza tra il valore minimo e massimo
MEDIAN valore del 50° percentile
SUM totale
NMISS numero di righe con valori mancanti
RUN;
______________________________________________________________________________
ISTRUZIONE SOMMA
L’istruzione di somma:
- crea la variabile a sinistra del segno più se ancora non esiste
- inizializza la variabile a zero prima della prima iterazione del passo di data
- mantiene automaticamente la variabile
- aggiunge il valore dell’espressione alla variabile in fase di esecuzione
- ignora i valori mancanti

Esempio
Data tot_mese2;
set prog2.vend_giorno2;
prgrmese+impvend;
run;
______________________________________________________________________________

BY FIRST LAST per calcolare variabili di gruppo


Esempio
DATA stip_reg_div (keep=regione div stipdiv num_dip);
SET reg_ord;
BY regione div;
IF first.div THEN DO;
Stipdiv=0; * Azzero la variabile d’appoggio;
Num_dip=0;
END;
Stipdiv+stip; * L’incremento;
Num_dip+1;
IF last.div;
RUN;
______________________________________________________________________________

PROC REPORT
Prima del PROC REPORT bisogna settare (se si vuole) le options:

OPTIONS
LS=n dimensione riga, numero massimo di caratteri
PS=n dimensione pagina, numero massimo di righe
NUMBER/NONUMBER se mettere o meno i numeri di pagina
DATE/NODATE stampa o meno la data e l’ora d’inizio della sessione
PAGENO=n reimposta la numerazione delle pagina dal numero n
CENTER/NOCENTER specifica se l’ouput è centrato o giustificato a sinistra
MISSING=’0’ per visualizzare i valori mancanti uguali a zero.

Per conoscere l’elenco delle opzioni usare la PROC OPTIONS SHORT/LONG; RUN;

PROC REPORT DATA = nome


<opzioni> :
HEADLINE sottolinea tutte le intestazioni delle colonne e gli spazi tra le stesse
HEADSKIP lascia una riga vuota sotto all’intestazione di colonna
SPLIT = ’carattere di suddivisione’

15
Specifica il carattere di suddivisione tra le colonne e l’intestazione di norma è il /
MISSING con questa opzione si include il valore di raggruppamento mancanti
WINDOWS|WD chiama la procedura in una finestra report interattiva (predefinita)
NOWINDOWS|NOWD visualizza il prospetto nella finestra di output

Creazione di prospetti
OUTREPT=libref.catalogo.nome-prospetto.REPT;
L’entrata di catalogo specificata nell’opzione OUTREPT= deve avere un nome a tre
livelli. Il quarto livello, REPT, viene aggiunto automaticamente.

LIST fa vedere sul log la definizione dei prospetti


TITLEn ‘testo’ aggiunge il titolo
FOOTNOTEn ‘testo’ aggiunge le note a piè pagina

COLUMN var1 var2 etc… definisco quali variabili voglio visualizzare nel report e con
quale ordine
Var1, var2 in questo modo vengono sovrapposte le colonne e somma
Var1, var2, MEAN in questo modo non somma ma fa la media
DEST (‘ Intestazione che voglio mettere ‘ var1,var2);
in questo modo inserisco una sovra intestazione sulle colonne
var1=alias_var1 in questo modo creo un alias che posso usare come colonna
aggiuntiva del proc report
var1, (var2 var3) per raggruppare più variabili sotto una variabile

DEFINE var1 <utilizzo> <attributi> per definire come voglio visualizzare la var1, assegnare
formati e definire l’aspetto della colonna

DISPLAY stampa il valore come sono del data set


ORDER ordina la visualizzazione per la variabile (DESCENDING se vogliamo che
ordini decrescente) (deve però precedere le altre colonne)
Può anche essere:
ORDER=DATA ordinamento del data set di input
ORDER=FORMATTED valore formattato crescente
ORDER=FREQ conteggio della frequenza crescente
ORDER=INTERNAL valore non formattato

Posso anche definire le seguenti statistiche:


SUM somma le variabili in base a come ho definito i gruppi
N numero di righe con valori non mancanti
MEAN fa la media sulle variabile in base a come ho definito i gruppi
MIN valore minimo
MAX valore massimo

GROUP consolida in una riga tutte le variabili che hanno lo stesso valore
ACROSS forma intestazioni delle colonne in orizzontale nella parte superiore del
prospetto con i valori della variabile
FORMAT = assegna il formato alla colonna
WIDTH = larghezza della colonna
CENTER/LEFT/RIGHT la giustificazione del testo nella colonna
SPACING numero di spazi a sinistra della colonna
NOPRINT non visualizza la colonna
FLOW manda a capo il valore di una variabile in orizzontale su più righe
‘intestazione colonna’ sostituisco il nome del variabile con l’intestazione
N / ‘Totale’ oppure MEAN /’Media’ (aggiungendo N o MEAN a column)
Questo ci da la possibilità di creare una colonna che contenga le tale
statistica per ogni riga del prospetto.

16
COMPUTED colonna calcolata su valori di altri variabili (va anche messa nell’istruzione
COLUMN )

E in fondo alla proc mettere:


COMPUTE variabile calcolata <specifica tipo>;
… Segmento codice …
ENDCOMP;

per mettere un commento nella riga di interruzione:


COMPUTE AFTER;
DEST=’Testo che voglio inserire’;
ENDCOMP;

BREAK before/after var1 <opz..> spezza dopo il cambio del valore del var1 che deve essere
una variabile di ordinamento o raggruppamento

RBREAK before/after var1 <opz..> spezza dopo il cambio del valore del var1 che deve essere
una variabile di ordinamento o raggruppamento e aggiunge
un totale generale al prospetto
Le possibili opzioni sono:
DOL sopralinea due volte scrivendo una riga di segni di uguale (=) sopra ciascun
carattere
DUL sottolinea due volte scrivendo una riga di segni di uguale (=) sotto ciascun
carattere
OL sopralinea scrivendo una riga trattini (-) sopra ciascun carattere nella riga di
sintesi
PAGE inizia una nuova pagina dopo ogni gruppo di linee di interruzione
SKIP scrive una riga vuota dopo ogni gruppo di linee di interruzione
SUMMARIZE scrive una riga di sintesi per le statistiche e le variabili calcolate in ogni
gruppo di righe di interruzione
SUPPRESS elimina la stampa del valore della variabile d’interruzione e di qualsiasi
sottolineatura o sopralineatura della colonna della variabile d’interruzione
nelle righe d’interruzione (valida solo per l’istruzione)
UL sottolinea scrivendo una riga trattini (-) sopra ciascun carattere nella riga di
sintesi
RUN;
______________________________________________________________________________

ODS
Le istruzioni ODS consentono di creare output in forme diverse.

ODS CSVALL crea un file con virgole come delimitatori con le seguenti caratteristiche:
• i valori di dati sono racchiusi tra doppi apici
• titoli e note a piè pagina sono mantenuti

FILE ’percorso e file’ <opzioni>; crea un file esterno

FILENAME fileref <tipo-periferica> ‘file-esterno’ <opzioni-host>

fileref specifica un nome SAS


<tipo-periferica> specifica il tipo di periferica o metodo d’accesso
‘file-esterno’ nome fisico del file esterno
<opzioni-host> opzioni

17
PUT variabile1 variabile2 variabile3; scrive righe nel file esterno specificato nell’ultima istruzione
file
PUT variabile1 formato1
variabile2 formato2
variabile3 formato3;

PROC FSLIST fileref=specifica-file <opzioni(i)> mi serve per visualizzare il file per capire com’è
meglio importarlo.

File HTML
Per creare un output su HTML si usa l’istruzione di ODS prima della creazione del report come da esempio:

ODS HTML FILE=’percorso e file.html’ <opzioni>;


… codice SAS …

CONTENTS=’nome_file’ contiene collegamenti a singole parti dell’output contenute nel body


file HTML
PAGE=’nome_file’ contiene collegamenti a singole pagine dell’output contenute nel
body file HTML
FRAME=’nome_file’ integra il sommario, il contenuto delle pagine e il body file HTML

… PROC PRINT…
… PROC MEANS …
… PROC FREQ …
… PROC REPORT DATA=…… ;
…..
…..
RUN;

ODS HTML CLOSE;

ODS HTML FILE=’percorso\nome_file.html’ style=’stile dei risultati’

ODS LISTING CLOSE se indirizzi l’output verso formati esterni usi prima di ods “formato” per
evitare output SAS proprietario.
ODS LISTING da usare per riaprire l’output.

Apertura e chiusura file


Se ODS HTML FILE=’percorso e file.html’ <opzioni>;
allora ODS HTML CLOSE;

Se ODS PDF FILE=’percorso e file.html’ <opzioni>;


allora ODS PDF CLOSE;

Se ODS RTF FILE=’percorso e file.html’ <opzioni>;


allora ODS RTF CLOSE;

Oppure generico ODS _ALL_ CLOSE;

Array
E’ possibile utilizzare ARRAY per semplificare i programmi che:
• eseguono calcoli ripetitivi
• creano numerose variabili con gli stessi attributi

18
• leggono dati
• ruotano data set SAS trasformando le variabili in osservazioni o viceversa.
• Confrontano variabili
• Effettuano un table lookup

Un ARRAY è un raggruppamento temporaneo di variabili SAS, esiste solo durante il passo di data e
non è una variabile.

ARRAY nome-array {indice} <$><lunghezza><elementi array><(Elenco valori iniziali)>;

{indice} descrive il numero e la disposizione degli elementi nell’array utilizzando un asterisco,


numero o intervallo di numeri. E indica il numero di elementi dell’array o del numero di
elementi dell’array multidimensionale.

<$> se presente l’array è alfanumerico

<lunghezza> specifica la lunghezza degli elementi dell’array se non già precedentemente definiti

<elementi array> indica gli elementi che costituiscono l’array

<(Elenco valori iniziali)> indica i valori iniziali degli elementi corrispondenti dell’array

L’istruzione ARRAY :
• deve avere elementi omogenei o numerici o alfanumerici
• serve per definire un array prima che si possa utilizzare
• crea le variabili se non già presenti nel PDV
• è un istruzione utilizzata in fase di compilazione

Esempio
ARRAY contrib2 {4} t1 trms2 terzot tr4;

DO variabile indice=1 TO numero elementi array;


altre istruzioni SAS …
nome array (variabile indice)
END;

Se non si vuole tenere la variabile indice dropparla alla fine del passo di data oppure la definisco
_TEMPORAY_

Esempio
ARRAY contrib{4} tr1 tr2 tr3 tr4;
DO pippo=1 TO 4;
cotrib{pippo}=contrib{pippo} *1.25;
END;

Esempio
DATA percentuale (drop=pippo);
SET prog2.versato;
Totale=sum (of tr1-tr4);
ARRAY contrib{4} tr1-tr4;
ARRAY percent{4}
DO pippo=1 TO 4;
percent {pippo} =contrib {pippo} totale;

19
END;
RUN;
La seconda istruzione ARRAY crea 4 variabili numeriche.

In caso di errore
Quando SAS rileva un errore nei dati:
1. Una note che descrive l’errore viene stampata nel log SAS.
2. Il record di input letto viene visualizzato nel log SAS (Contenuto nel buffer di input).
3. I valori dell’osservazione SAS creata vengono visualizzati nel log SAS (contenuto nel PDV )
4. Un valore missing viene assegnato alla variabile SAS appropriata.
5. l’esecuzione prosegue.

DATA data-set / DEBUG; attiva il debug


Comandi:
STEP invio scorre il programma un istruzione alla volta
EXAMINE E var1 visualizza il valore della variabile
WATCH W var1 sospende l’esecuzione quando cambia il valore della variabile
LIST WATCH L W elenca le variabili che sono sottocontrollo
QUIT Q interrompe l’esecuzione del passo di data
_ALL_ per vedere tutte le variabili

20
NON IN ESAME
______________________________________________________________________________

PROC DATASETS LIBRARY=libreria_di_riferimento;


MODIFY nome del data set;
RENAME vecchio_nome_data_set=nuovo_nome;
LABEL variabile1=’descrizione1’
Variabile2=’descrizione2’
etc…
FORMAT elenco variabili1 format1
elenco variabili2 format2
etc…

INFORMAT elenco variabili1 format1


elenco variabili2 format2
etc…
RUN;
______________________________________________________________________________

PROC IMPORT OUT=WORK.dfwlax;


DATAFILE = “C:\corsocb\winsas\prog1\DallasLA.xls”
DBMS=EXCEL REPLACE (sovrascrive un data set esistente)
SHEET = “DFWLAX”; (Nome dello specifico foglio che voglio sia letto)
GETNAME=YES; (Cerca di prendere i nomi delle variabili dalla prima riga del file)
MIXED=NO; (Converte i valori numerici di una colonna avente dati misti in alfanumerici
di default sarebbe no)
SCANTEXT=YES; prende il valore della stringa più lunga come lunghezza
SCANTIME=YES; cerca dei valori data nelle righe
USEDATE=YES/NO per far importare le date con il formato data di SAS o meno
che usa il formato datetime19
RUN;

PROC SUMMARY
PROC SUMMARY DATA=data-set;
CLASS variabile di raggruppamento;
VAR variabile analisi;
OUTPUT OUT = new data-set
SUM = nome variabile create dalla statistica
MEAN = nome variabile create dalla statistica;
Ci vuole una nome per le variabili statistic per ogni variabile di analisi
RUN;

Non produce nessun output stampato e statistiche per tutte le variabili numeriche.

Fornisce le seguenti statistiche:


N numero di righe con valori non mancanti
MEAN media aritmetica
STD deviazione standard

21
MIN valore minimo
MAX valore massimo
Ma può anche calcolare: MEDIAN, P1, P5, P10, P90, P95, P99, Q1, Q3, QRANGE

Opzioni aggiuntive:

TYPES var1*var2 var1*var3; Specifica quali combinazioni di variabili mi interessano


Oppure
var1*(var2 var3); La stessa cosa scritta in altro modo

WAYS 1 2; Include una variabile di nome _WAY_, che contiene un numero da 1 al massimo
numero di variabili di classe che la PROC usa.
Es
WAYS 1 2 var1 var2 var3; incrocia nel modo seguente: var1*var2 var1*var3 var2*var3

CHARTYPE; Specifica che la colonna _TYPE_ contiene valori alfanumerici


PRINTIDVARS; Stampa il valore delle colonne ID in un prospetto.

CLASS=INTERNAL | FORMATTED | DATA | FREQ


Specifica la sequenza di ordinamento per i livelli delle variabili di classificazione nell’output.

DESCENDING per mettere l’ordinamento decrescente


MISSING considera i valori mancanti come livelli validi delle variabili di
classificazione
GROUPINTERNAL specifica di non applicare formati alle variabili di classificazione, utile per i
valori numerici discreti
L’istruzione VAR supporta la seguente opzione: WEIGHT= specifica variabili di peso diverse

AUTONAME risolve i conflitti nei nomi creando delle serie nome1 nome2 etc…
IDGROUP MIN|MAX crea valori estremi nella tabella OUT=
______________________________________________________________________________

PROC MEANS
PROC MEANS DATA=data-set NOPRINT;
VAR variabile analisi;
CLASS variabile di raggruppamento;
OUTPUT OUT=new data-set STATISTIC=nome variabile create dalla statistica;
Ci vuole una nome per le variabili statistic per ogni variabile di analisi
RUN;
______________________________________________________________________________

Combinazione data set


DATA data-set; Concatenazione non ordinata
SET data-set1 data-set1 … data-setn;
RUN;

DATA data-set; Concatenazione ordinata


SET data-set1 data-set1 … data-setn;
BY variabile/i d’ordinamento;
RUN;

DATA data-set; Concatenazione ordinata con if sulla provenienza


SET data-set1 (in=pippo) data-set1 … data-setn;
BY variabile/i d’ordinamento;

22
IF pippo oppure IF pippo=1…..;
RUN;

DATA data-set; combinazione ordinata


MERGE data-set1 data-set1 … data-setn;
BY variabile/i d’ordinamento;
RUN;

Proc SQL
La PROC SQL consente di:
• unire tabelle e generare un prospetto in un solo passo
• unire tabelle senza dati ordinati
• utilizzare criteri di associazione complessi
Restituisce un prospetto e non un tabella. In generale la PROC SQL richiede una maggiore quantità
di tempo CPU e di memoria rispetto a un passo di data.

PROC SQL;
CREATE TABLE nome AS crea la tabella
SELECT alias1.var1, alias2.var1, …, varn selezione delle variabili (* per prenderle tutte)
FROM data-set1 AS alias1, data-set2 AS alias2, … data-setn data set
WHERE alias1.var1=alias2.var1 condizione
;
QUIT;

INNER JOIN per creare una tabella dall’intersezione di due tabelle

Proc Format
I formati possono essere di tipo :
• valore che definiscono valori numerici o alfanumerici
• immagine per creare schemi
• input per controllare la lettura e memorizzazione dei valori
I valori mancanti si possono definire ‘ ‘ o .
Posso usare parole chiave:
OTHER per indicare tutti i valori non specificatamente indicati
HIGH per il valore numerico più alto
LOW per il valore numerico più basso

PROC FORMAT LIBRARY=libreria-formati.nome-catalogo per definire formati permanenti


VALUE $fmtalfa ‘valore1’=’valore formattato 1’
‘valore2’=’valore formattato 2’

‘valoren’=’valore formattato n’;

VALUE $fmtnum valore1=valore formattato 1


valore2=valore formattato 2

valoren=valore formattato n;
VALUE $fmt… (MULTILABEL) per definire formati con più etichette possibili
…. ;
RUN;

23
I nomi dei formati non possono essere ovviamente uguali ai formati SAS. Devono iniziare con il $, essere al
massimo di 8 caratteri, sono memorizzati come entrate in cataloghi.

Se non metto LIBRARY=libref. i formati sono creati nella work e durano solo per la sessione SAS.

Per utlizzare formati permanenti o ricercare in più cataloghi uso:


OPTIONS FMTSEARCH=(catalogo1 catalogo2 … catalogon);

PROC CATALOG CATALOG=libreria-formati.CATALOG; per definire un catalogo


CONTENTS <OUT=data-set> <FILE=fileref>;
COPY OUT=<libreria-formati.>CATALOG ;
SELECT entrata1…n;
EXCLUDE entrata1…n;
DELETE entrata1…n;
RUN;
QUIT;

Esempio
PROC FORMAT LIBRARY=prog2.FORMATS
VALUE $ROTTE ‘Rotta1’=’Zona 1’
‘Rotta2’-‘Rotta4’=’Zona 2’
‘Rotta5’-‘Rotta7’=’Zona 3’
‘ ‘=’Mancante’
OTHER=’Sconosciuta’;
RUN;
PROC CATALOG CATALOG cat=prog2. FORMATS
CONTENTS;
RUN;

E nel programma aggiungo:


OPTIONS FMTSEARCH=(prog2);

PROC FORMAT LIBRARY=libreria-formati.nome-catalogo per definire formati da un data set


CNTLIN= data-set;
RUN;
il data-set CNTLIN:
• deve contenere le variabili FMTNAME, START e LABEL
• se è alfanumerico deve contenere la variabile TYPE o iniziare con il $
• se non crea una variabile END si assume che sia uguale alla START

PROC FORMAT LIBRARY=libreria-formati.nome-catalogo per documentare un catalogo


FMTLIB= data-set;
<alter istruzioni>;
RUN;

PROC FORMAT LIBRARY=libreria-formati.nome-catalogo per definire un data-set da un formato


CNTLOUT= data-set;
SELECT <$>nome formato;
RUN;

Proc Tabulate
Serve per creare prospetti di sintessi a una a tre dimensioni. In cui si possono calcolare le seguenti
statistiche:

24
N numero di righe con valori non mancanti
SUM somma
MEAN media aritmetica
VAR varianza
STD deviazione standard
MIN valore minimo
MAX valore massimo
RANGE intervallo

PROC TABULATE DATA=data-set <opzioni>;


CLASS variabili di classificazione;
VAR variabili di analisi;
TABLE espressione-pagina, 1° dimensione
espressione-riga, 2° dimensione
espressione-colonna <opzione> ; 3° dimensione
Con la TABLE si definisce la struttura e il formato della tabella, con le seguenti convenzioni:
, separa le dimensioni di una tabella
* incrocia elementi di una dimensione
Spazio concatena elementi di una dimensione
() raggruppa elementi e associa un operatore a un gruppo
= assegna la descrizione a una variabile o una statistica
ALL crea una nuova colonna/riga con il totale per riga/colonna (a seconda della
dimensione in cui è inserita)
RUN;

FORMAT= serve per definire un formato per le celle della tabella, sì può usare qualisiasi formato sas
valido

LABEL serve per definire un etichetta per le variabili di classificazione ed analisi


KEYLABEL permette di sostituire un’etichetta a ciascuna parola chiave utilizzata nella tabella
RTS= nell’istruzione TABLE consente di impostare un valore numerico intero, che indica il numero di
posizioni disponibili per i titoli di riga. (Predefinito un quarto del LINESIZE)
INDENT= nell’istruzione TABLE consente di specificare un numero di spazi di cui rientrare ciascun
livello di incrocio di riga
MISSING indica che i valori mancanti devono essere considerati come livelli validi per l variabili di
classificazione
PRINTMISS richiede che siano stampate le righe e colonne per i valori mancanti
MISSTEXT consente di indicare fino a venti caratteri che verranno stampati nelle celle con valori
missing
NOSEPS elimina le linee separatrici orizzontali della tabella
OUT= serve per creare una tabella di output

Esempio
PROC TABULATE DATA=prog2.piloti FORMAT=dollarz10.;
WHERE cod_lav ? ‘PT’;
CLASS sesso cod_lav;
VAR stipendio;
TABLE cod_lav * sesso, stipendio= ‘ ‘ * (mean min max) rts=15 indent=3;
FORMAT sesso $sesso. Cod_lav $codice.;
KEYLALBEL MEAN=’Stipendio medio’
MIN=’Stipendio minimo’
MAX=’Stipendio massimo’;
RUN;

25
Proc Gchart
PROC GCHART DATA=data-set; serve per creare grafici
HBAR variabile da rappresentare <opzioni>; grafico a barre orizzontali
VBAR variabile da rappresentare <opzioni>; grafico a barre verticali
PIE variabile da rappresentare <opzioni>; grafico a torta
Opzioni:
/DISCRETE per far si che le variabili numeriche non siano rappresentate in
maniera continua ma in maniera discreta
/SUMVAR=variabile di analisi fa la somma o la media incrementale delle variabile
/TYPE=MEAN|SUM specifica che si rappresenta una media o una somma
/FILL=S|X specifica nel caso di grafico torta se riempire (S) o tratteggiare(X) il
grafico
/EXPLODE=’PILOTA3’ serve per evidenziare una singola fetta da un grafico a torta
RUN;
QUIT;

PROC GCHART supporta l’elabroazione di più istruzioni per singola PROC

GOPTIONS
GOPTIONS è un opzione globale per definire la periferica grafica, una volta sottomessa rimane attiva per
l’intera sessione (ovviamente va messa prima della PROC GCHART )
Possibili valori:
DEV=HPD Hp Deskjet Printer
DEV=HPL Hp Laserjet Printer
DEV=GIF Gif Driver
DEV=TK1 Tektronix Driver
DEV=PDF Portable Document
DEV=PSL PostScript Driver
DEV=WMF Windows Metafile Driver
Per l’elenco completo vedere il catalogo sashelp.device

TITLE FOOTNOTE per aggiungere titoli o note a piè pagina


COLOR= per definire il colore del testo che segue l’opzione
FONT= per definire il tipo di carattere del testo che segue l’opzione
(Ad esempio DUPLEX, SIMPLEX, BRUSH e SPECIAL)
HEIGHT= per definire l’altezza dei caratteri del testo che segue l’opzione

Per l’elenco completo vedere il catalogo sashelp.device

GPLOT
PROC GPLOT DATA=data-set; serve per rappresentare l’andamento tra due variabili
PLOT variabile-orizzontale* variabile-verticale /<opzioni>;
SYMBOL1 opzione; per definire come voglio rappresentato il mio grafico, può essere un opzione
…. globale o aggiuntiva
SYMBOLn opzione;
L’opzione può essere:
VALUE=simbolo|V=simbolo è possono essere: PLUS, STAR,SQUARE,DIAMOND TRIANGLE
NONE
I=interpolazione serve per tracciare linee
JOIN unisce punti con linee rette
SPLINE unisce punti con una linea curva
NEEDLE traccia linee verticali dai punti degli assi
WIDTH=lunghezza|W=lung. per definire lo spessore della linea

26
COLOR=colore|C=colore per definire il colore della linea
SYMBOL; elimina l’ultima istruzione SYMBOL

GOPITONS RESET=SYMBOL; elimina tutte le istruzioni SYMBOL

Le opzioni possibili sono


/HAXIS=valori dimensione dell’asse orizzontale
/VAXIS=valori dimensione dell’asse verticale
/CAXIS=valori colore degli assi
/CTEXT=valori colore del testo sugli assi

RUN;
QUIT;

è possibile:
• specificare i simboli per rappresentare i dati
• utilizzare metodi d’interpolazione
• specificare stili, colori e spessori
• tracciare linee di riferimento per gli assi
• posizionare una o più linee di riferimento all’interno degli assi

Stili ODS
STYLE=(attribute1=valore1 … attributen=valoren); serve per cambiare l’aspetto dei prospetti
Gli attribute possono essere:
BACKGROUND=colore per cambiare il colore dello sfondo
FOREGROUND=colore per cambiare il colore del primo piano
FONT_FACE=stile times, helvetica, curier
FONT_SIZE=larghezza 8pt, 9pt, 10pt, 11pt, 12pt
FONT_STYLE=stile italic, roman
FONT_WEIGHT=peso bold, medium
FONT_WIDTH=spessore narrow, wide

Utilizzo degli stili con la proc report


E’ possibile utilizzare l’opzione STYLE (COMPONENT)=(ATTRIBUTE=valore) in istruzioni:
PROC REPORT
DEFINE
BREAK
COMPUTE
RBREAK

COMPONENTE ALCUNI ATTRIBUTI UTLIZZO DELL’ATTRIBUTO


PROSPETTO CELLPADDING Quantità di spazio vuoto su ogni
lato del testo
OUTPUTWIDTH Ampiezza della tabella HTML
JUST Allineamento
INTESTAZIONE BACKGROUND Colore dello sfondo
FOREGROUND Colore del testo
FONT_WEIGHT Medium, Bold
JUST Center, Left, Right
COLONNA BACKGROUND Colore dello sfondo
FOREGROUND Colore del testo
FONT_WEIGHT Center, Left, Right
JUST Center, Left, Right

27
RIEPILOGO BACKGROUND Colore dello sfondo
FOREGROUND Colore del testo

Esempio

ODS HTML PATH=’C:/’ (url=none) BODY=’report1.html’;


ODS LISTING CLOSE;
FOOTNOTE;

PROC REPORT DATA=PROG2.ASSVOLO NOWD


STYLE(report) = [JUST=left OUTPUTWITH=50%]
STYLE(header) = [BACKGROUND=cyan]
STYLE(column) = [FOREGROUND=blue BACKGROUND=white]
TITLE ‘Informazioni sugli assistentidi volo’;
COLUMN cod_lav sesso stip_annuo;
DEFINE cod_lav /GROUP;
STYLE(header) = [JUST=center FOREGROUND=magenta BACKGROUND=pink]
STYLE(column) = [JUST=left FONT_FACE=helvetica]
DEFINE sesso /GROUP;
STYLE(header) = [JUST=center
FONT_FACE=times
FONT_WEIGTH=bold
BACKGROUND=yellow]
STYLE(column) = [JUST=left
FONT_FACE=courier
FONT_SIZE=4
FOREGROUND=very dark blue
BACKGROUND=yellow]
DEFINE stip_annuo /SUM;
STYLE(header) = [JUST=center
FONT_WITDH=narrow]
STYLE(column) = [JUST=right
FONT_WITDH=narrow]
RUN;
ODS HTML CLOSE;
ODS LISTING;

Altro

Eichhorn

http://www.milanofinanza.it/giornali/dettaglio_giornali.asp?preview=false&id=1563013&codiciTestate=8

APPUNTI
Charmap x caratteri speciali
Copia pag.45-47 SAS 2

28
Se fai girare su DI il passo di data:

data

_NULL_;

a=pathname("work");

put

a=;

run;

poi vai sul log, copi l’indirizzo fisico che ti ha messo li e lo incolli al posto di

<path> nel seguente codice da eseguire (con F3, non F12) sulla sessione di sas base con cui sei sul server:

rsubmit;

libname

www "<path>";

endrsubmit;

29
libname

www slibref= www server=serv;

ottieni che riesci a mapparti la libreria di work del DI e puoi guardare tutto quello che succede.

Ciao

Mauro

30