5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo...

29
83 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset SAS (proc print) e quella che permette di visualizza le caratteristiche del dataset e delle variabili che lo compongono, elencate in ordine alfabetico (proc contents). Come tutte le altre procedure presenti nel SAS anche queste possono essere personalizzate utilizzando delle opportune opzioni. In queste dispense verranno esplicitamente considerate solo le procedure più comuni, ma l’elenco completo e la loro descrizione è reperibile nel manuale online messo a disposizione dal software. La forma più semplice di sintassi della procedura che effettua la stampa a terminale è la seguente proc print data=<nome_del_dataset>; var <elenco delle variabili, separate da almeno uno spazio bianco>; format <elenco delle variabili, ciascuna con l’indicazione del formato>; in cui l’istruzione “data=” serve per specificare il dataset da stampare. Se questa istruzione viene omessa il SAS, per default, stampa a terminale l’ultimo dataset creato. L’istruzione “var” serve per specificare le variabili da stampare, che compariranno nell’ordine in cui vengono elencate. La sua omissione fa sì che il programma stampi tutte le variabili contenute nel dataset, nell’ordine in cui sono state lette. L’istruzione “format” serve per specificare il formato di stampa delle variabili. Considerato, per esempio, il dataset SAS “tassi”, contenuto nella directory “c:\es_MRS”, che riporta il tasso di occupazione, il tasso di disoccupazione ed il tasso di attività di cinque comuni di una provincia italiana, se si volessero visualizzare a terminale solo i tassi di occupazione e di disoccupazione, il primo espresso da 2 cifre decimali ed il secondo espresso con 3 cifre decimali, si potrebbero utilizzare le seguenti istruzioni

Transcript of 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo...

Page 1: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

83

5. PROCEDURE SAS PER LA GESTIONE DI DATASET

5.1 Proc Print

Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di

un dataset SAS (proc print) e quella che permette di visualizza le caratteristiche del dataset e delle

variabili che lo compongono, elencate in ordine alfabetico (proc contents).

Come tutte le altre procedure presenti nel SAS anche queste possono essere personalizzate utilizzando

delle opportune opzioni. In queste dispense verranno esplicitamente considerate solo le procedure più

comuni, ma l’elenco completo e la loro descrizione è reperibile nel manuale online messo a

disposizione dal software.

La forma più semplice di sintassi della procedura che effettua la stampa a terminale è la seguente

proc print data=<nome_del_dataset>;

var <elenco delle variabili, separate da almeno uno spazio bianco>;

format <elenco delle variabili, ciascuna con l’indicazione del formato>;

in cui l’istruzione “data=” serve per specificare il dataset da stampare. Se questa istruzione viene

omessa il SAS, per default, stampa a terminale l’ultimo dataset creato.

L’istruzione “var” serve per specificare le variabili da stampare, che compariranno nell’ordine in cui

vengono elencate. La sua omissione fa sì che il programma stampi tutte le variabili contenute nel

dataset, nell’ordine in cui sono state lette.

L’istruzione “format” serve per specificare il formato di stampa delle variabili.

Considerato, per esempio, il dataset SAS “tassi”, contenuto nella directory “c:\es_MRS”, che riporta il

tasso di occupazione, il tasso di disoccupazione ed il tasso di attività di cinque comuni di una provincia

italiana, se si volessero visualizzare a terminale solo i tassi di occupazione e di disoccupazione, il primo

espresso da 2 cifre decimali ed il secondo espresso con 3 cifre decimali, si potrebbero utilizzare le

seguenti istruzioni

Page 2: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

84

data tassi;

set "c:\es_MRS\tassi.sas7bdat";

proc print data=tassi;

var tasso_occup tasso_disocc;

format tasso_occup 8.2 tasso_disocc 8.3;

run;

che generano il seguente output

Oss tasso_occup tasso_disocc

1 0.49 0.085

2 0.52 0.074

3 0.54 0.094

4 0.49 0.100

5 0.65 0.089

Come in tutte le procedure che danno luogo a un output, anche la “proc print” dà la possibilità di

inserire una o più righe contenente i titoli che si vogliono assegnare all’output stampato a terminale

mediante la parola chiave “title” seguita dal numero della riga su cui deve comparire il titolo, da uno

spazio bianco e dal testo del titolo, racchiuso fra apici. La prima riga di titolo può essere indicata con

“title1” o, più semplicemente, con “title”, mentre i titoli successivi devono necessariamente

contenere l’indicazione numerica della riga corrispondente.

Così, per esempio, se si volessero stampare 3 titoli, su tre righe diverse, si potrebbero utilizzare le

istruzioni

title1 'testo del primo titolo';

title2 'testo del secondo titolo';

title3 'testo del terzo titolo';

Se, per esempio, si volesse stampare il dataset precedente inserendo le seguenti due righe

Comuni della provincia XXX

Tassi di occupazione e di disoccupazione

si potrebbe utilizzare le seguenti istruzioni

Page 3: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

85

proc print data=tassi;

var tasso_occup tasso_disocc;

format tasso_occup 8.2 tasso_disocc 8.3;

title1 'Comuni della provincia XXX';

title2 'Tassi di occupazione e di disoccupazione';

run;

Va notato che le istruzioni relative ai titoli sono memorizzate in modo permanente dal SAS, nel senso

che restano valide fino a quando non viene chiusa la sessione di lavoro. Pertanto, una volta indicato un

titolo, sarà necessario modificarlo negli step successivi.

La proc print consente anche di stampare solo un certo numero di record, a partire dal primo o da

uno qualsiasi. Questo risultato viene utilizzando opportune opzioni racchiuse fra parentesi tonde, dopo

il nome del dataset da visualizzare.

Per stampare solo le prime k osservazioni l’opzione è

proc print data=<nome_del_dataset>(obs=k);

run;

in cui compare fra parentesi la parola chiave “obs=” che, seguita dal numero k (che il SAS colora

automaticamente in verde acqua), indica al software di stampare a terminale solo i primi k record.

Se invece si desidera stampare k record, ma a partire dal v-esimo, l’istruzione da utilizzare è la seguente

proc print data=<nome_del_dataset> (firstobs=v obs=v+k-1);

run;

In questo caso la parola chiave “firstobs=”, seguita dal numero v (che il SAS colora automaticamente

in verde acqua), indica al software che la prima osservazione da considerare corrisponde al v-esimo

record, mentre la parola chiave “obs” indica al software di stampare a terminale k record a partire dal

v-esimo.

Per esempio, nella prima proc print dell’esempio successivo si chiede al programma di stampare solo

i primi 2 record, mentre con la seconda proc print vengono visualizzati sempre 2 record, ma questa

volta a partire dal terzo.

Page 4: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

86

Esempio 5.1.1

proc print data=tassi (obs=2);

proc print data=tassi (firstobs=3 obs=4);

run;

L’output ottenuto è infatti costituito dai due dataset seguenti

Oss tasso_occup tasso_disocc tasso_attiv

1 0.4861 0.0847 0.5320

2 0.5244 0.0741 0.5446

Oss tasso_occup tasso_disocc tasso_attiv

3 0.5367 0.0936 0.5939

4 0.4908 0.1004 0.5245

Un’altra opzione talvolta utile consiste nel chiedere al software di non stampare la variabile “OSS” che

è prevista per default e che compare sempre come prima variabile del dataset stampato a terminale,

come si è visto negli esempi precedenti. In questo caso si utilizza l’istruzione “noobs” prima del punto

e virgola che chiude l’istruzione in cui compare la “proc print”, come mostrato nel listato successivo

proc print data=tassi noobs;

run;

che fornisce il seguente dataset

tasso_occup tasso_disocc tasso_attiv

0.4861 0.0847 0.5320

0.5244 0.0741 0.5446

0.5367 0.0936 0.5939

0.4908 0.1004 0.5245

0.6468 0.0889 0.5892

Page 5: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

87

In altre situazioni si può avere bisogno di ottenere la stampa di un dataset separata a seconda delle

determinazioni assunte da una variabile (quantitativa o qualitativa). Questo risultato si ottiene

inserendo l’istruzione “by” seguita dal nome della variabile in questione.

proc print data=<nome_del_dataset>;

var <elenco delle variabili, separate da almeno uno spazio bianco>;

by <nome della variabile rispetto alla quale si vogliono stampe separate >;

Va sottolineato il fatto che il dataset da stampare deve essere già ordinato a seconda di questa variabile.

Se questo ordinamento non è già presente, l’ordinamento va effettuato prima della “proc print” con

un’altra procedura, la “proc sort”, che verrà descritta più avanti.

Si consideri, per esempio, il dataset grano1.txt che si trova nella directory "c:\es_MRS” nel quale le

informazioni su una singola unità statistica sono contenute su 4 righe successive, la prima delle quali

riporta la varietà del grano, mentre le 3 seguenti riportano i valori di 3 diverse variabili quantitative. In

questo caso le modalità della variabile grano sono già elencate ordinatamente nel dataset in input.

Il programma successivo crea il file temporaneo “grano”, denomina le variabili varieta, x1, x2 e x3 ed

effettua la stampa del dataset separatamente per ciascuna varietà di grano

data grano;

infile 'c:\es_MRS\grano1.txt';

input varieta $ / x1 x2 x3;

proc print;

by varieta;

run;

L’output assume la forma successiva

Page 6: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

88

varieta=Centauro

Oss x1 x2 x3

1 6.90 13.6 78.8

2 6.90 13.4 77.9

3 6.60 13.8 75.8

4 6.65 11.3 78.8

5 7.75 11.2 79.6

6 7.72 12.1 80.7

7 7.53 11.9 80.7

8 6.16 11.5 81.4

9 3.88 11.1 77.9

10 4.32 11.6 76.1

11 4.39 11.1 77.0

12 5.45 12.6 82.0

13 4.80 12.3 81.6

14 4.70 12.6 81.4

15 7.50 11.4 78.9

varieta=Eridano

Oss x1 x2 x3

16 9.00 14.3 83.5

17 7.90 13.4 79.1

18 7.90 14.6 80.1

19 5.20 11.5 79.8

20 6.10 11.6 80.1

21 7.10 11.8 81.3

22 7.10 12.3 82.4

23 7.33 12.5 83.1

24 7.27 11.6 83.8

25 4.47 11.7 80.6

26 4.86 12.0 77.9

27 4.44 12.2 78.8

28 4.15 12.8 84.2

29 4.45 12.7 83.7

30 5.60 13.0 83.8

Page 7: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

89

varieta=Pandas

Oss x1 x2 x3

31 7.75 13.9 81.1

32 6.65 13.5 79.5

33 7.00 13.8 79.1

34 5.40 12.1 76.4

35 4.70 12.4 76.0

36 5.80 11.8 77.3

37 7.21 12.2 81.2

38 7.11 12.2 82.6

39 7.14 11.8 83.0

40 5.10 12.2 77.0

41 5.05 12.1 78.3

42 5.29 12.4 77.8

43 5.60 12.9 82.2

44 5.30 12.8 82.4

45 5.10 12.3 82.4

Page 8: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

90

5.2 Proc Format

Questa procedura viene usata per creare una libreria di formati di variabili, che verranno utilizzati in

tutti i DATA STEP e/o nei PROC STEP successivi e che sono permanenti, nel senso che resteranno

validi per tutta la durata della sessione di lavoro.

La sua sintassi è

proc format <opzioni>;

invalue <elenco delle variabili in input e loro formato >;

value <elenco delle variabili in output e loro formato >;

dove si userà la parola chiave “invalue” e/o “value” a seconda che si voglia attribuire un formato alle

variabili in input e/o alle variabili in output.

Di seguito è riportato un esempio di questa procedura applicato al dataset “stud1” contenente alcune

variabili rilevate su 4 studenti universitari: matricola, sesso, se si tratta di studente in corso o fuori

corso, e una variabile dicotomica che indica se lo studente ha ottenuto almeno 100 CFU.

Esempio 5.2.1a

data stud1;

input matricola 6. @8 genere $1. @10 incorso 1. @12 almeno100CFU 1.;

cards;

101122 m 1 1

101132 f 2 1

101234 f 1 2

101321 m 2 1

;

proc format;

value $sesso 'm'='maschio'

'f'='femmina';

value si_no 1='sì'

2='no';

proc print;

format genere $sesso.

incorso si_no.

Almeno100CFU si_no.;

run;

Con le istruzioni contenute in questa proc format si fissano due diversi formati:

- quello denominato “$sesso” si potrà utilizzare per variabili alfanumeriche,

- quello denominato “si_no” si potrà utilizzare per variabili numeriche.

Page 9: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

91

Nei “value” che compaiono all’interno della proc format, infatti, il primo carattere dei formati che si

riferiscono a variabili qualitative è sempre costituito dal simbolo “$”, mentre questo simbolo non deve

comparire nei formati riferiti a variabili quantitative.

In questo esempio si stabilisce che le determinazioni “m” e “f” corrispondono rispettivamente a

“maschio” e “femmina”. Come si nota, le determinazioni assunte da una variabile qualitativa e i loro

formati vanno indicati fra apici e sono evidenziati automaticamente in viola dal SAS.

Il formato denominato “si_no” è invece utilizzabile solo per variabili numeriche che assumono due

diversi valori: 1 oppure 2. In questo esempio si stabilisce che il valore 1 corrisponde a “sì”, mentre il

valore “2” corrisponde a “no”.

Le determinazioni assunte da una variabile quantitativa sono numeri, non vanno indicate fra apici e

sono evidenziati automaticamente in verde acqua dal SAS, mentre i formati corrispondenti sono invece

indicati fra apici ed evidenziati in viola dal SAS.

Nell’esempio considerato le istruzioni utilizzate nella proc format servono per stampare a terminale il

dataset in modo che alle determinazioni “m” e “f” assunte dalla variabile “genere” corrispondano i

formati “maschio” e “femmina”, mentre ai valori “1” e “2” delle variabili “incorso” e

“almeno100CFU” corrispondano rispettivamente le determinazioni “sì” e “no”, come si nota

dall’output ottenuto che è riportato qui di seguito.

Oss matricola genere incorso almeno40CFU

1 101122 maschio sì sì

2 101132 femmina no sì

3 101234 femmina sì no

4 101321 maschio no sì

Va sottolineato il fatto che quando si richiamano i formati fissati con la proc format il nome

assegnato al formato va seguito dal punto e viene colorato in verde acqua dal SAS, come accade per

“$sesso.” e “si_no.” nell’esempio appena considerato.

In questo caso l’assegnazione dei formati mediante la proc format è stata effettuata dopo il DATA

STEP ma in realtà, di solito, la proc format viene posizionata all’inizio del programma, così da

rendere chiaro che i formati stabiliti restano validi per tutta l’esecuzione del programma stesso.

Page 10: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

92

Inoltre, nell’esempio, l’attribuzione dei formati alle tre variabili considerate è stata effettuata all’interno

della proc print, ma potrebbe essere effettuata anche all’interno del DATA STEP, se la proc format

fosse stata la prima istruzione del programma.

Il listato del programma riportato nell’esempio 5.2.1a, quindi, sarebbe potuto essere anche il seguente

Esempio 5.2.1b

proc format;

value $sesso 'm'='maschio'

'f'='femmina';

value si_no 1='sì'

2='no';

data stud1;

input matricola 6. @8 genere $1. @10 incorso 1. @12 almeno100CFU 1.;

format genere $sesso.

incorso si_no.

Almeno100CFU si_no.;

cards;

101122 m 1 1

101132 f 2 1

101234 f 1 2

101321 m 2 1

;

proc print;

run;

e l’output risultante sarebbe rimasto comunque invariato.

La proc format può essere utilizzata con obiettivi differenti come, per esempio, per costruire una

distribuzione in classi. Se nel dataset in input è presente una variabile numerica che assume molti valori

diversi, attraverso la proc format la si potrebbe trasformare in una variabile (numerica o

alfanumerica) che assume determinazioni diverse per diverse classi di valori della variabile originaria.

Nell’esempio successivo viene creato all’interno del programma un dataset che contiene la matricola e

il voto ad un esame di un gruppo di 5 studenti. Con la proc format si sostituisce la determinazione

“basso” a un voto universitario compreso nell’intervallo [18, 22], la determinazione “medio” a un voto

compreso nell’intervallo [23, 26] e la determinazione “alto” a un voto maggiore o uguale a 27.

Va osservato però che, in questo modo, la variabile originaria viene sovrascritta in fase di stampa

(anche se non vengono effettivamente sovrascritti nel dataset), per cui può essere preferibile costruire

una variabile diversa, per esempio attraverso un’opportuna sequenza di istruzioni “if”.

Page 11: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

93

Esempio 5.2.2

proc format;

value voto_form 18-22='basso'

23-26='medio'

27-30='alto';

data voti;

input matricola voto;

cards;

101122 23

101132 22

101234 19

101321 26

101396 28

;

proc print;

format voto voto_form.;

run;

L’output ottenuto dall’esecuzione delle istruzioni precedenti risulta

Oss matricola voto

1 101122 medio

2 101132 basso

3 101234 basso

4 101321 medio

5 101396 alto

Page 12: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

94

5.3 Proc Contents

Questa procedura, utilizzata in precedenza quando si è effettuato il cambio di variabile da numerica ad

alfanumerica e viceversa, serve per descrivere le caratteristiche di un dataset, restituendo il percorso

necessario per trovarlo, il suo nome (completo di estensione) e il formato delle variabili in esso

presenti.

La sua sintassi è

proc contents data=<nome_del_dataset>;

dove, se viene omesso il nome del dataset, per default il SAS prenderà in esame l’ultimo.

Se, per esempio si considerano le seguenti istruzioni

Esempio 5.3.1

data archivio;

input x y $ z;

format x comma12.3 y $7. z 1.;

cards;

3455.457 piccolo 0

7568.903 medio 1

11777.346 grande 1

;

proc contents;

run;

si otterranno le seguenti informazioni relative alle variabili

Elenco alfabetico di variabili e attributi

# Variabile Tipo Lungh Formato

1 x Num 8 COMMA12.3

2 y Alfanum 8 $7.

3 z Num 8 1.

Questa procedura può risultare molto utile quando si importa un dataset all’interno di un programma e

non se ne conosce la sua struttura.

Page 13: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

95

5.4 Proc Export

La procedura Export serve per effettuare l’operazione opposta rispetto a quella analizzata nel paragrafo

relativo alla proc import, viene cioè utilizzata quando si desidera trasformare un dataset SAS in un

dataset di formato differente. La sintassi di questa procedura è

PROC EXPORT DATA=<libref.>SAS dataset <(SAS dataset option(s))>

OUTFILE="filename" | OUTTABLE="tablename"

<DBMS=identifier> <REPLACE> <LABEL>;

dove l’istruzione “dbms=” può assumere le determinazioni indicata nella tabella 3.5.1 del paragrafo 3.5.

Il programma seguente, per esempio, trasforma il dataset SAS denominato “studenti”, creato all’interno

del programma, in un dataset EXCEL permanente, denominato “stud.xls”, che si trova nella directory

"c:\es_MRS".

Esempio 5.4.1

data studenti;

input sesso $ voto;

cards;

m 23

f 19

m 18

m 22

f 25

f 26

;

proc export data=studenti

dbms=xls

outfile="c:\es_MRS\stud";

run;

Il file Excel così creato contiene le seguenti informazioni

sesso voto

m 23

f 19

m 18

m 22

f 25

f 26

Page 14: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

96

Se invece si utilizzassero le seguenti istruzioni all’interno della “proc export”

proc export data=studenti

dbms=csv

outfile="c:\es_MRS\stud";

run;

si otterrebbe il seguente file permanente stud, sempre nella medesima directory, che è un file CSV

(Comma Separated Value) che può essere aperto, per esempio, con l’applicazione “blocco note”, ed è

costituito dai seguenti record

sesso,eta

m,23

f,19

m,18

m,22

f,25

f,26

Per generare invece un file delimitato (ossia con estensione .dlm) si deve specificare, oltre all’opzione

DBMS=DLM, il delimitatore che separa le singole determinazioni delle variabili. Tale delimitatore è,

per default, lo spazio bianco, ma può essere personalizzato aggiungendo l’istruzione

DELIMITER=“simbolo_delimitatore";

dove il simbolo di delimitazione deve essere racchiuso fra apici (o virgolette): Se, per esempio, si

desidera usare il simbolo “&”, l’istruzione assumerà la forma

DELIMITER='&';

Pertanto, se si utilizzassero le seguenti istruzioni

Page 15: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

97

proc export data=studenti

outfile="c:\es_MRS\stud"

dbms=dlm

replace;

delimiter='&';

run;

dove l’opzione “replace” fa sì che il SAS sovrascriva l’archivio precedentemente creato, si otterrebbe

(sempre nella medesima directory) un file, denominato “stud” avente la forma seguente

sesso&eta

m&23

f&19

m&18

m&22

f&25

f&26

Se si volesse sostituire il delimitatore “&” con uno spazio bianco sarebbe sufficiente far eseguire al

SAS le seguenti istruzioni

proc export data=studenti

outfile="c:\es_MRS\stud"

dbms=dlm

replace;

run;

e in questo caso il file di testo “stud” avrebbe la forma seguente

sesso eta

m 23

f 19

m 18

m 22

f 25

f 26

Page 16: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

98

5.6 La Proc SORT

Questa procedura esegue l'ordinamento dei record di un dataset a seconda delle determinazioni (che

possono essere sia valori numerici sia stringhe alfanumeriche) assunte da una o più variabili. Tale

ordinamento, effettuato sulla base del codice ASCII, per default è effettuato in modo non decrescente

ma, con un’opportuna istruzione descritta in seguito, può essere effettuata anche in modo non

crescente.

La sintassi è la seguente

PROC SORT DATA=<nome_del_dataset> <opzioni>;

BY [descending] <variabile/variabili>;

dove l'istruzione “BY” indica la variabile o le variabili da considerare per l’ordinamento. Questa

istruzione deve essere necessariamente specificata.

Quando si desidera ordinare i record sulla base delle determinazioni assunte da più variabili,

l'ordinamento viene fatto a partire dalla prima elencata dopo l’istruzione “by”. Se, per esempio, si

volessero ordinare i record a seconda delle determinazioni, ordinate in modo non decrescente, di una

variabile X e di una variabile Y, le istruzioni saranno del tipo

PROC SORT DATA=<nome_del_dataset> <opzioni>;

BY X Y;

e l’ordinamento verrà eseguito sulla base della variabile X e, all’interno di un gruppo di unità che

presentano una stessa determinazione di tale variabile, sulla base delle determinazioni assunte dalla Y.

L’opzione “descending” si utilizza quando si desidera un ordinamento a partire dalla determinazione

più alta fino alla più bassa (ossia in ordine non crescente). Questa istruzione va inserita prima del nome

della variabile rispetto alla quale si vuole stabilire l’ordinamento.

Per esempio, le istruzioni seguenti effettuano l’ordinamento delle osservazioni a seconda dei valori

ordinati in modo non crescente rispetto alla X e in base ai valori non decrescenti della Y

PROC SORT DATA=<nome_del_dataset> <opzioni>;

BY descending X Y;

Page 17: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

99

Fra le possibili opzioni che possono essere considerate per questa procedura quella più utilizzata

assume la forma

OUT = <nome_del_data_set>

e viene usata per specificare il nome del dataset di uscita. In assenza di tale istruzione, il dataset

ordinato si sovrappone a quello originale (se il programma ha girato correttamente).

Esempio 5.6.1

Si consideri il dataset SAS “american_data”, contenuto nella directory “c:\es_MRS”, che contiene i dati

relativi a:

- la ditta di alcune aziende americane (“ditta”)

- i debiti espressi in migliaia di dollari (“debito”),

- l’identificativo associato a ciascun cliente (“numero_conto”)

- la città in cui opera l’azienda (“citta”)

Si vogliono ordinare i record presenti nell’archivio a seconda delle determinazioni assunte dalla

variabile “città” e, all’interno di questa, a seconda delle determinazioni assunte dalla “ditta”, seguendo

in entrambi i casi l’ordine non decrescente.

Il file creato, di tipo temporaneo, deve essere denominato “city_company” e va stampato a terminale,

con le seguenti due righe di titolo:

Clienti indebitati

elencati in ordine alfabetico all'interno di ciascuna città

Le variabili dovranno inoltre comparire nell’ordine specificato qui di seguito: citta, ditta, debito,

numero_conto.

Un programma SAS che soddisfa queste richieste è il seguente

data origine;

set 'c:\es_MRS\american_data.sas7bdat';

proc sort data=origine out=city_company;

by citta ditta;

proc print data=city_company;

var citta ditta debito numero_conto;

title 'Clienti indebitati';

title2 'elencati in ordine alfabetico all''interno di ciascuna città';

run;

Page 18: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

100

dove il dataset SAS viene letto utilizzando l’istruzione “set” seguita dal percorso e dal nome completo

del file.

L’output assume la forma riportata di seguito

Clienti indebitati

elencati in ordine alfabetico all'interno di ciascuna città

Oss citta ditta debito numero_conto

1 Apex Apex Catering 37.95 9923

2 Apex Paul's Pizza 83.00 1019

3 Apex Peter's Auto Parts 65.79 7288

4 Apex Tina's Pet Shop 37.95 5108

5 Apex Watson Tabor Travel 37.95 3131

6 Garner Boyd & Sons Accounting 312.49 4762

7 Garner Deluxe Hardware 467.12 8941

8 Garner Elway Piano and Organ 65.79 5217

9 Garner World Wide Electronics 119.95 1122

10 Holly Springs Ice Cream Delight 299.98 2310

11 Holly Springs Tim's Burger Stand 119.95 6335

12 Morrisville Bob's Beds 119.95 4998

13 Morrisville Pauline's Antiques 302.05 9112

14 Morrisville Strickland Industries 657.22 1675

Esempio 5.6.2

Sulla base del medesimo dataset SAS dell’esempio precedente si consideri ora un programma SAS che

esegue l’ordinamento dei record a seconda della variabile città (ordinata in senso crescente), del debito

(in senso decrescente) e dell’identificativo (in senso crescente).

Il file creato, di tipo permanente, dovrà comparire nella medesima directory del file originario ed essere

denominato “city_company1”. Dovrà essere stampato a terminale, con le seguenti due righe di titolo:

Clienti indebitati

elencati per città e valori decrescenti del debito

Page 19: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

101

Le variabili dovranno inoltre comparire nell’ordine specificato qui di seguito: citta, debito, ditta,

numero_conto.

Un programma SAS che soddisfa queste richieste è il seguente

libname libreria 'c:\es_MRS';

data origine;

set 'c:\es_MRS\american_data.sas7bdat';

proc sort data=origine out=libreria.city_company1;

by citta descending debito ditta;

proc print;

var citta debito ditta numero_conto;

title 'Clienti indebitati';

title2 'elencati per città e valori decrescenti del debito';

run;

e il corrispondente output assume la forma

Clienti indebitati

elencati per città e valori decrescenti del debito

Oss citta debito ditta numero_conto

1 Apex 83.00 Paul's Pizza 1019

2 Apex 65.79 Peter's Auto Parts 7288

3 Apex 37.95 Apex Catering 9923

4 Apex 37.95 Tina's Pet Shop 5108

5 Apex 37.95 Watson Tabor Travel 3131

6 Garner 467.12 Deluxe Hardware 8941

7 Garner 312.49 Boyd & Sons Accounting 4762

8 Garner 119.95 World Wide Electronics 1122

9 Garner 65.79 Elway Piano and Organ 5217

10 Holly Springs 299.98 Ice Cream Delight 2310

11 Holly Springs 119.95 Tim's Burger Stand 6335

12 Morrisville 657.22 Strickland Industries 1675

13 Morrisville 302.05 Pauline's Antiques 9112

14 Morrisville 119.95 Bob's Beds 4998

Page 20: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

102

Esercizi riepilogativi

Esercizio 5.1

Considerato il file excel “occup.xls” nella directory “c:\es_MRS” creare un dataset SAS temporaneo di

nome “occup_FVG” che contenga le sole osservazioni relative al Friuli Venezia Giulia e, per ciascun

record, calcolare i seguenti tassi:

- di occupazione “tas_occ” (rapporto fra numero di occupati e popolazione di 15 o più anni)

- di disoccupazione “tas_dis” (rapporto fra numero di chi è cerca un’occupazione e forze lavoro)

- di attività “tas_att” (rapporto forze lavoro e popolazione di 15 o più anni)

Stampare a terminale solo la denominazione e i tre tassi, con 4 cifre decimali.

Soluzione

Il programma SAS potrebbe assumere la forma

proc import datafile="c:\es_MRS\occup.xls" dbms=xls out=occup;

data occup_FVG; set occup;

if reg=6;

tas_occ = occupati/Popolazione_di_15_anni_o_pi_;

tas_dis = In_cerca_di_occupazione/Forze_di_lavoro;

tas_att = Forze_di_lavoro/Popolazione_di_15_anni_o_pi_;

proc print;

var denominazione tas_occ tas_dis tas_att;

Format tas_occ 8.4 tas_dis 8.4 tas_att 8.4;

run;

e la stampa deve consistere nel seguente file

Oss Denominazione tas_occ tas_dis tas_att

1 CIVIDALE DEL FRIULI 0.4421 0.0920 0.4869

2 LATISANA 0.4645 0.0858 0.5081

3 SAN GIORGIO DI NOGARO 0.4460 0.0838 0.4868

4 TARVISIO 0.4904 0.0654 0.5248

5 TOLMEZZO 0.4640 0.0693 0.4985

6 UDINE 0.4644 0.0736 0.5013

7 GORIZIA 0.4568 0.0780 0.4955

8 MONFALCONE 0.4402 0.0820 0.4795

9 TRIESTE 0.4469 0.0745 0.4829

10 MANIAGO 0.4725 0.0699 0.5080

11 PORDENONE 0.4965 0.0711 0.5345

Page 21: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

103

Esercizio 5.2

I seguenti dati

M 3 3 4 3

F 3 3 3 4

F 3 2 2 4

F 3 3 3 3

M 2 3 3 3

M 1 2 3 2

indicano il sesso e le modalità di risposta a 4 domande (D1, D2, D3 e D4) contenute nei questionari di

valutazione della didattica compilati da 6 studenti.

Creare il dataset all’interno del programma denominandolo “risposte” e stamparlo a terminale facendo

comparire la dicitura “maschio” e “femmina” per il sesso e le modalità di risposta elencate di seguito

per le 4 variabili D1, D2, D3 e D4:

1. Decisamente no;

2. Più no che sì;

3. Più sì che no;

4. Decisamente sì.

Soluzione

Il programma SAS potrebbe assumere la forma

data risposte;

input sesso $ D1-D4;

cards;

M 3 3 4 3

F 3 3 3 4

F 3 2 2 4

F 3 3 3 3

M 2 3 3 3

M 1 2 3 2

;

proc print;

proc format;

value $sex 'M' = 'maschio'

'F' = 'femmina';

value DOM 1 = 'Decisamente no'

2 = 'Più no che sì'

3 = 'Più sì che no'

4 = 'Decisamente sì';

proc print;

format sesso $sex. D1 DOM. d2 DOM. D3 DOM. D4 DOM.;

run;

e la stampa ottenuta è la seguente

Page 22: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

104

Oss sesso D1 D2 D3 D4

1 maschio Più sì che no Più sì che no Decisamente sì Più sì che no

2 femmina Più sì che no Più sì che no Più sì che no Decisamente sì

3 femmina Più sì che no Più no che sì Più no che sì Decisamente sì

4 femmina Più sì che no Più sì che no Più sì che no Più sì che no

5 maschio Più no che sì Più sì che no Più sì che no Più sì che no

6 maschio Decisamente no Più no che sì Più sì che no Più no che sì

Page 23: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

105

Esercizio 5.3

Considerato il dataset SAS “fratelli” presente nella directory “c:\es_MRS” si crei il file SAS

temporaneo, denominato “frat1”, contenente solo le variabili “l1” e “b1”. Si crei una variabile

alfabetica “l1a” che assume le determinazioni:

- “a” se l1 è maggiore di 162 e minore o uguale a 180,

- “b” se l1 è maggiore di 180 e minore o uguale a 190,

- “c” se l1 è maggiore di 190 e minore o uguale a 208,

e una variabile alfabetica “b1a” che assume le determinazioni:

- “a” se b1 è maggiore di 136 e minore o uguale a 146,

- “b” se b1 è maggiore di 146 e minore o uguale a 156,

- “c” se b1 è maggiore di 156 e minore o uguale a 168,

Tramite la “proc format” si utilizzino i seguenti formati:

- per “l1a” si creino le classi: 162 – 180, 180 – 190 e 190 – 208

- per “b1a” si creino le classi: 136 – 146, 146 – 156 e 156 – 168

Si stampi il dataset ottenuto in questo modo a terminale visualizzando solo le variabili ident, l1, l1a, b1

e b1a, in questo ordine, ed eliminando la variabile “OSS”.

Soluzione

libname libr1 "c:\es_MRS";

data frat1; set libr1.fratelli;

if 162 < l1 <= 180 then l1a='a';

else if 180 < l1 <= 190 then l1a='b';

else if l1> 190 then l1a='c';

if 136 < b1 <= 146 then b1a='a';

else if 146 < b1 <= 156 then b1a='b';

else if b1> 156 then b1a='c';

proc format;

value $l1a 'a'='162 – 180'

'b'='180 – 190'

'c'='190 – 208';

value $b1a 'a'='136 – 146'

'b'='146 – 156'

'c'='156 – 168';

proc print noobs;

var ident l1 l1a b1 b1a;

format l1a $l1a. b1a $b1a.;

run;

La stampa corrispondente, ottenuta a terminale, assume la forma seguente

Page 24: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

106

ident l1 l1a b1 b1a

1 191 190 – 208 155 146 – 156

2 195 190 – 208 149 146 – 156

3 181 180 – 190 148 146 – 156

4 183 180 – 190 153 146 – 156

5 176 162 – 180 144 136 – 146

6 208 190 – 208 157 156 – 168

7 189 180 – 190 150 146 – 156

8 197 190 – 208 159 156 – 168

9 188 180 – 190 152 146 – 156

10 192 190 – 208 150 146 – 156

11 179 162 – 180 158 156 – 168

12 183 180 – 190 147 146 – 156

13 174 162 – 180 150 146 – 156

14 190 180 – 190 159 156 – 168

15 188 180 – 190 151 146 – 156

16 163 162 – 180 137 136 – 146

17 195 190 – 208 155 146 – 156

18 186 180 – 190 153 146 – 156

19 181 180 – 190 145 136 – 146

20 175 162 – 180 140 136 – 146

21 192 190 – 208 154 146 – 156

22 174 162 – 180 143 136 – 146

23 176 162 – 180 139 136 – 146

24 197 190 – 208 167 156 – 168

25 190 180 – 190 163 156 – 168

Page 25: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

107

Esercizio 5.4

Considerato il dataset SAS “fratelli” presente nella directory “c:\es_MRS” si crei il file SAS

temporaneo, denominato “frat2”, contenente solo le variabili “ident”, “l2” e “b2”, ordinato in modo

crescente secondo il valore di l2 e in modo decrescente secondo il valore di b2.

Soluzione

libname libr1 "c:\es_MRS";

data frat1; set libr1.fratelli;

proc sort out=frat2;

by l2 descending b2;

proc print noobs;

var ident l2 b2;

run;

Il dataset stampato a terminale risulta il seguente (da cui, per brevità, sono state omesse alcune righe

centrali)

ident l2 b2

16 161 130

20 165 137

5 171 142

18 173 148

12 174 147

23 176 143

22 178 147

1 179 145

19 182 146

17 183 158

13 185 152

21 185 152

3 185 149

…. … ..

14 195 157

9 197 159

24 200 158

2 201 152

Page 26: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

108

Esercizio 5.5

Si consideri il dataset “pottery.xls” presente nella directory “c:\es_MRS” relativo alla composizione

chimica della ceramica (rappresentata dalle variabili “Al”, “Fe”, “Mg”, “Ca” e “Na”) rilevata per

diverse località (variabile “site”). Si effettui la stampa separata del dataset a seconda delle

determinazioni assunte dalla variabile “site” eliminando la variabile “OSS”

Soluzione

Un programma che effettua le operazioni richieste è il seguente

proc import datafile="c:\es_MRS\pottery.xls" out=a dbms=xls replace;

proc print;

proc sort data=a;

by site;

proc print noobs;

by site;

run;

e l’output fornito dal SAS risulta quello riportato di seguito in cui, come si vede, il titolo di ogni tabella

indica la modalità assunta dalla variabile “site”

Site=AshleyRails

Al Fe Mg Ca Na

17.7 1.12 0.56 0.06 0.06

18.3 1.14 0.67 0.06 0.05

16.7 0.92 0.53 0.01 0.05

14.8 2.74 0.67 0.03 0.05

19.1 1.64 0.6 0.1 0.03

Site=Caldicot

Al Fe Mg Ca Na

11.8 5.44 3.94 0.3 0.04

11.6 5.39 3.77 0.29 0.06

Page 27: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

109

Site=IsleThorns

Al Fe Mg Ca Na

18.3 1.28 0.67 0.03 0.03

15.8 2.39 0.63 0.01 0.04

18 1.5 0.67 0.01 0.06

18 1.88 0.68 0.01 0.04

20.8 1.51 0.72 0.07 0.1

Site=Llanedyrn

Al Fe Mg Ca Na

14.4 7 4.3 0.15 0.51

13.8 7.08 3.43 0.12 0.17

14.6 7.09 3.88 0.13 0.2

11.5 6.37 5.64 0.16 0.14

13.8 7.06 5.34 0.2 0.2

10.9 6.26 3.47 0.17 0.22

10.1 4.26 4.26 0.2 0.18

11.6 5.78 5.91 0.18 0.16

11.1 5.49 4.52 0.29 0.3

13.4 6.92 7.23 0.28 0.2

12.4 6.13 5.69 0.22 0.54

13.1 6.64 5.51 0.31 0.24

12.7 6.69 4.45 0.2 0.22

12.5 6.44 3.94 0.22 0.23

Page 28: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

110

Esercizio 5.6

Il dataset “students.sas7bdat” presente nella directory “c:\es_MRS” si riferisce a un gruppo di studenti

di varie età su cui sono state rilevate le variabili “sesso” (f = femmina, m = maschio), “altezza” (in

pollici) e “peso” (in libbre). Si desidera:

- esprimere l’altezza in centimetri (1 pollice equivale a 2.54 cm.) denominando la variabile

“altezza_cm” e il peso in chilogrammi (1 libbra equivale a circa 0.453592 kg.) denominando la

variabile “peso_kg”.

- mantenere solo le variabili “sesso”, “altezza_cm” e “peso_kg”.

- ordinare le osservazioni mettendo prima tutti i file relativi ai maschi e successivamente quelli

relativi alle femmine ed esportare il file permanente, denominato “class” in formato Excel, con

estensione “.xls”.

Soluzione

Un programma in grado di effettuare tutte le operazioni richieste è riportato nel riquadro seguente

data a;

set "c:\es_MRS\students.sas7bdat";

/*effettuo la trasformazione delle variabili*/

altezza_cm=altezza*2.54;

peso_kg=peso*0.453592;

/*scarto le variabili non richieste*/

drop altezza peso;

/*ordino le osservazioni*/

proc sort;

by descending genere;

/*esporto il dataset in formato XLS*/

proc export outfile="c:\es_MRS\class" replace

dbms=xls;

run;

e il file ottenuto, presente nella directory “c:\es_MRS”, assume la forma seguente

Page 29: 5. PROCEDURE SAS PER LA GESTIONE DI DATASET 5.1 Proc Print€¦ · Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di un dataset

111

genere altezza_cm peso_kg

m 158,75 51,0291

m 158,75 50,802304

m 149,86 47,173568

m 156,21 46,946772

m 168,91 50,802304

m 165,1 51,709488

m 156,21 63,50288

m 157,48 48,76114

m 150,622 39,462504

f 143,002 38,55532

f 158,242 47,62716

f 160,782 48,987936

f 149,86 41,730464

f 143,51 31,297848

f 157,48 42,864444

f 136,652 31,071052

f 156,21 47,173568

f 163,83 56,018612

f 148,082 42,184056

f 130,302 22,906396

f 149,352 40,369688