Documente Academic
Documente Profesional
Documente Cultură
Partajarea unui set de date SAS implică selectarea observațiilor dintr-un set de date prin
definirea criteriilor de selecție, de obicei într-o instrucțiune WHERE sau IF.
De exemplu, să presupunem că se doreşte selectarea tuturor observațiilor din setul de date SAS
permanent sondaj aflat în biblioteca exemple, unde valoarea variabilei gen este F. O modalitate
de a face acest lucru este cu o instrucțiune WHERE, după cum urmează:
DATA femei;
SET exemple.sondaj;
WHERE gen = 'F';
RUN;
Amintiți-vă că variabilele utilizate într-o instrucțiune WHERE trebuie să provină dintr-un fişier
de date SAS. Variabilele care sunt create prin citirea datelor brute sau dintr-o instrucțiune de
1
atribuire nu pot fi utilizate în acest mod. În programul de mai sus, setul de date femei conține
toate observațiile din fişierul de date Sondaj în care Gen are valoarea F.
Iată o listă a acestui set de date:
Listing of FEMEI
ID Gen Varsta Salariu Intreb1 Intreb 2 Intreb 3 Intreb 4 Intreb 5
002 F 55 76123 4 5 2 1 1
004 F 67 128000 5 3 2 2 4
007 F 45 76100 5 3 4 3 3
Observați că setul de date Femei conține toate variabilele găsite în setul de date Sondaj.
Dacă nu aveți nevoie de una sau mai multe variabile din setul de date de intrare (setul de date
din instrucțiunea SET), puteți utiliza o opțiune DROP = sau KEEP = set de date.
De exemplu, pentru a omite SALARIU din noul set de date, puteți utiliza următoarea metodă:
data femei;
set exemple.sondaj (drop=Salariu);
where gen = 'F';
run;
II.9.2. Crearea mai multor subset-uri de date SAS într-un singur DATA Step
Dintr-un set de date de intrare se pot crea mai multe subseturi de date SAS (SQL nu face).
După exemplul anterior, puteți crea un set de date care conține numai date despre femei și unul
care conține numai date despre bărbați, într-un singur pas astfel:
2
II.9.3. Combinarea de tabele SAS
II.9.3.1. Conbinarea Unu la Unu
Se face prin mai multe instructiuni set cu care se pot citi mai multe tabele diferite sau acelasi
tabel de mai multe ori;
Forma generala este:
DATA tabela-rez;
SET tabela-1;
SET tabela-2;
RUN;
unde:
tabela-rez este numele tabelului nou creat;
tabela-1 şi tabela-2 sunt tabelele sursă care se vor combina;
Noul tabel va contine toate variabilele din toate tabelele specificate prin instrucţiunea
SET.
Observatiile sunt combinate pe baza pozitiilor lor relative din fiecare tablă - prima
observatie este cuplata cu prima observatie din al doilea tabel, s.a.m.d.; pasul DATA
se opreste cand intalneste primul sfarsit de tabel – deci cand se termina cel mai mic dintre
tabele.
Daca tabelele sursa au variabile cu acelasi nume, variabila din ultimul tabel va
supra-scrie toate informatiile citite din tabelele anterioare.
Numarul de observatii din tabelul nou creat este egal cu numarul cel mai mic de
observatii din tabelele sursa.
Tabela A Tabela B
CodPro Denumir CodProd Cantitate
d e
1 P1 2 100
3 P2 4 20
5 P3
Programul
data one2one;
set A;
set B;
run;
Tabela rezultată va fi
3
CodPro Denumire Cantitate
d
2 P1 100
4 P2 20
II.9.3.2. Concatenarea
Concatenarea:
tabelele sunt asezate unul după altul;
noul tabel va contine toate variabilele din toate tabelele concatenate.
Forma generală:
DATA concat;
SET A B;
RUN;
Într-o instrucțiune SET se pot specifica mai multe seturi de date și SAS va adăuga toate
observațiile împreună pentru a forma un singur set de date.
Să presupunem că doriți să creați un singur set de date din mai multe seturi de date similare. De
exemplu, compania dvs. poate colecta date în fiecare lună în seturi de date separate și doriți să
analizați date pe o perioasă de un an.
Tabela-1
N Id Nume Greutate
r
1 7 Popescu 75
2 1 Ionescu 90
3 2 Pop 100
4 4 Vasile 80
Tabela-2
Nr Id Nume Greutate
1 9 Adam 120
2 3 Avram 65
3 5 Ion 95
4
O modalitate de a combina aceste seturi de date este următoarea:
data tabela-rez 1-2;
set A B;
run;
Toate observațiile din setul de date Tabela-1sunt urmate de toate observațiile din setul de date
Tabela-2. SAS se referă la acest proces ca seturi de date concatenate.
Tabela3
N Id Gen Nume
r
1 10 M Popescu
2 15 F Ionescu
3 20 M Pop
Setul de date tabela3 conține o nouă variabilă, Gen și nu conține variabila Greutate. Numele
variabilei Nume din ambele seturi de date are aceeași lungime.
DATA Tabela_rez_1_3;
SET Tabela1 Tabela3
5
RUN;
Rezultatul este
Tabela-1
N Id Nume Greutate Gen
r
1 7 Popescu 75
2 1 Ionescu 90
3 2 Pop 100
4 4 Vasile 80
5 10 Popescu M
6 15 Ionescu F
7 20 Pop M
În zona buffer se aduc variabilele (cu atributele lor) din Tabela1 (Id, Nume, Greutate).
Se verifică structută Tabela3
Dacă există alte variabile faţă de cele din Tabela1(Gen) se completează cu ele zona buffer.
Se iniţializează toate variabilele cu valori lipsă.
Toate observaţiile din Tabela1 sunt citite și scrise în Tabela_rez_1_3.
Se iniţializează variabilele aferente Tabela3 cu valori lipsă.
Toate observaţiile din Tabela3 sunt citite și scrise în Tabela_rez_1_3.
Dacă lungimea unei variabile este diferită în oricare dintre seturile de date de intrare,
lungimea variabilei din setul de date de ieșire este egală cu lungimea pe care o are variabila
din primul set de date întâlnit în etapa DATA.
Este o idee bună să verificați lungimile variabilelor de caractere atunci când combinați mai multe
seturi de date pentru a vă asigura că nu veți trunchia nici o valoare. Dacă este necesar, plasați o
instrucțiune LENGTH înainte de instrucțiunea SET pentru a vă asigura că lungimea rezultată
este adecvată pentru a vă ține toate valorile.
Rețineți că lungimea unei variabile de caractere este determinată de îndată ce acea variabilă intră
în PDV; acesta nu poate fi schimbat după aceea.
În cele din urmă, dacă aveți o variabilă în două seturi de date, un caracter și altul numeric, SAS
imprimă un mesaj de eroare în jurnal și programul se termină.
6
Dacă fiecare dintre seturile de date care urmează să fie combinate este deja sortat, pentru
intercalarea lor se poate utiliza instrucțiunea SET cu o instrucțiune BY.
SAS selectează observațiile din fiecare set de date de intrare în ordine, iar setul de date rezultat
este deja sortat.
Tabela-2
Nr Id Nume Greutate
1 9 Adam 120
2 3 Avram 65
3 5 Ion 95
7
DATA tabela_rez;
SET Tabela1 Tabela2;
BY Id;
RUN;
Tabela-rez
Id Nume Greutate
1 Ionescu 90
2 Pop 100
3 Avram 65
4 Vasile 80
5 Ion 95
7 Popesc 75
u
9 Adam 120
Exemplu 2:
DATA vanzari;
SET vanzari1999 vanzari2000;
BY luna;
RUN;
De exemplu, ați putea avea un set de date angajat (Angajat) care să conțină numărul de
identificare și numele şi un alt set de date (Ore) care conține numărul de identificare, împreună
cu departamentul în care lucrează și numărul de ore lucrate, este posibil să se dorească să se
adauge numele angajatului (din setul de date Angajat) la fiecare observație din setul de date Ore.
8
5 Avram 9 Productie 57
7 Vasile
Forma generala:
DATA tabela_rez;
MERGE Tabela1 Tabela2;
BY <DESCENDING> variabila(le);
RUN;
unde:
Tabela_rez denumeste tabelul nou creat de pasul data;
Tabela1 şi Tabela2 - tabelele SAS din care se citesc datele;
variabila(le) in instrucţiunea BY specifica una sau mai multe variabile dupa care se unesc
observatiile
<DESCENDING> indica faptul ca datele sursa sunt ordonate in ordine descrescatoare dupa
variabila care urmeaza; daca in lista BY sunt mai multe variabile, <descending> are efect
doar asupra variabilei care urmeaza imediat dupa ea.
Tabelele din instructiunea BY trebuie sa fie sortate inainte de executarea pasului DATA;
variabilele din BY trebuie sa aiba acelasi tip in toate tabelele unite de instructiunea MERGE;
descending nu se poate folosi cu tabele indexate pentru ca acestea sunt intotdeauna ordonate
crescator.
DATA tabela-rez;
MERGE angajat ore;
BY Id;
RUN;
În primul rând se sortează fiecare tabelă de intrare în funcţie de variabila sau variabilele care
leagă cele două seturi de date. Apoi, în instrucţiunea MERGE se indică numele fabelelor sortate,
urmând instrucțiunea BY prin care se indică denumirea variabilei sau a variabilelor care indică
SAS care observații trebuie plasate în aceeași observație.
Tabela-rez
Id Nume Departament Ore
1 Popescu Contabilitate 39
2 Ionescu
9
4 Grigoresc Productie 44
u
5 Avram Contabilitate 35
7 Vasile
9 Productie 57
In tabelul rezultat vor aparea toate observatiile din toate tabelele sursa.
Daca unul din tabelele de intrare nu contine observatii pentru o anumita valoare a variabilei BY
in tabelul rezultat acestea se completeaza cu valoarea nulă MISSING
Dacă s-ar omite instrucțiunea BY, primele trei observații din setul de date Angajat ar fi corelate
cu primele trei observații din setul de ore Ore. Rezultatul ar fi complet greșit.
S-ar putea să se dorească ca setul de date fuzionat să conțină numai acei angajați care se află în
setul de date Ore sau să se verifice dacă angajații din setul de date Ore nu se regăsesc în setul de
date despre angajați. În acest scop se utilizează opţiunea IN =
DATA nou;
MERGE angajat(in=InAngajat)
ore (in=InOre);
BY Id;
FILE PRINT;
PUT ID= InAngajat = InOre = Nume= Departament= Ore=;
RUN;
O opțiune IN = set de date urmează după fiecare nume de set de date. După cuvântul cheie IN =
este un nume de variabilă pe care îl creați.
În acest exemplu, au fost alese numele InAngajat și InOre. Aceste două variabile sunt variabile
temporare (SAS nu le va adăuga la setul de date de ieșire). Ele au o valoare de 1 (adevărat) în
cazul în care setul de date la care se referă aduce o contribuție la observația curentă și 0 (fals)
altfel. Deoarece aceste variabile nu sunt în setul de date de ieșire, programul anterior utilizează o
instrucțiune PUT pentru a lista valorile acestor variabile, împreună cu alte variabile din setul de
date. Rrezultatul este:
ID=1 InAngajat =1 InOre =1 Nume=Popescu Departament= Contabilitate Ore=39
ID=2 InAngajat =1 InOre =0 Nume = Ionescu Departament = Ore =
ID=4 InAngajat =1 InOre =1 Nume = Grigorescu Departament = Productie Ore =44
ID=5 InAngajat =1 InOre =1 Nume = Avram Departament = Contabilitate Ore =35
ID=7 InAngajat =1 InOre =0 Nume = Vasile Departament = Ore =.
ID=9 InAngajat =0 InOre =1 Nume = Departament = Productie Ore =57
10
Puteți utiliza variabilele IN = pentru a controla care observații sunt scrise în setul de date de
ieșire. De exemplu, dacă doriți numai acei angajați care se află în ambele seturi de date, puteți
adăuga o instrucțiune IF la pasul DATA, după cum urmează:
DATA combine;
MERGE Angajat(IN= InAngajat)
ore(IN= InOre);
BY ID;
IF InAngajat AND InOre;
RUN;
sau if InEmploy = 1 and InHours = 1;
Interclasarea a două seturi de date care au nume de variabile diferite în instrucţiunea BY -
în acest caz se va utiliza opțiune RENAME =
Se poate folosi
DATA tabela_rez;
MERGE Angajat Ore (RENAME=(IdPers = Id));
BY Id;
RUN;
Interclasarea unu-la-unu, unu-la mai multi
În exemplele de îmbinare prezentate anterior, în ambele seturi de date, a existat o singură
observație pentru fiecare valoare a variabilei BY. Aceasta se numește interclasare unu-la-unu.
Este posibil ca un set de date să aibă o singură observație pentru fiecare valoare a variabilei BY,
dar celălalt set de date să aibă mai multe observații pentru fiecare valoare a variabilei BY.
Aceasta este denumită interclasare unu-la-multe.
11
De exemplu, tabelele următoare:
Tabela Produse Tabela Vanzari
Cod Denumire Cod Cantitate
123 Masa 123 200
222 Scaun 123 250
333 Canapea 222 205
333 317
333 400
333 500
Dacă aveți două seturi de date care au câteva variabile comune și efectuați o interclasare de
seturi de date, valorile din cel de-al doilea set de date înlocuiesc valorile din primul set de
date, chiar dacă valorile din al doilea set de date sunt lipsite de valori.
Dacă folosiți o instrucțiune UPDATE, valorile lipsă din al doilea set de date nu înlocuiesc
valorile din primul set de date. Aceasta face ca declarația UPDATE să fie perfectă pentru
actualizarea valorilor într-un set de date de bază din noile valori dintr-un set de date de
tranzacție.
12
Preturi Preţuri_actualizate
DATA Preturi_15dec2005;
UPDATE Preturi Preţuri_actualizate;
BY Cod;
RUN;
13
Pot fi definite oricâte comenzi SQL într-o procedură SQL. Este o bună practică să se plaseze
QUIT la finalul declaraţiei, nefiind însă obligatoriu.
De exemplu programul de mai jos crează un query prin intermediul instrucţiunii SELECT:
PROC SQL;
SELECT Id,
Inaltime,
Greutate
FROM exemple.date
WHERE Greutate GT 66;
QUIT;
Dacă doriți să selectați toate variabilele dintr-un set de date, puteți utiliza un asterisc (*)
PROC SQL;
SELECT *
FROM exemple.date
WHERE Greutate GT 66;
QUIT;
Dacă doriți ca rezultatul interogării să fie stocat într-un set de date SAS, includeți un cuvânt
cheie CREATE
PROC SQL;
CREATE TABLE tabela1 AS
SELECT *
FROM exemple.date
WHERE Greutate GT 66;
QUIT;
14
II.10.1. Joncţiunea a două tabele (Merge)
Se pot selecta variabile din două tabele listând toate variabilele de interes în clauza SELECT
și enumerând cele două seturi de date din clauza FROM.
Dacă o variabilă are același nume în ambele seturi de date, este nevoie de o modalitate de a
distinge ce set de date se va utiliza.
Considerând două tabele
Tabela1 Tabela2
Inaltim Ge
Id Greutate Id DataNasterii Nume
e n
001 155 68 001 10/15/1960 M Popescu
003 250 74 002 08/01/1955 M Ionescu
004 110 63 003 12/25/1988 F Georgescu
005 95 60 005 05/28/1949 F Ion
PROC SQL;
SELECT tabela1.Id,
tabela2.Id,
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1,
exemple. Tabela2;
QUIT;
Deoarece coloana Id este în ambele tabele, prefixați numele variabilei cu numele tabelului.
Rezultatul va fi:
Inaltim
Id Id Greutate Nume Gen
e
00
001 68 155 Popescu M
1
00
002 68 155 Ionescu M
1
00
003 68 155 Georgescu F
1
00
005 68 155 Ion F
1
00
001 74 250 Popescu M
3
15
00
002 74 250 Ionescu M
3
00
003 74 250 Georgescu F
3
00
005 74 250 Ion F
3
00
001 63 110 Popescu M
4
00
002 63 110 Ionescu M
4
00
003 63 110 Georgescu F
4
00
005 63 110 Ion F
4
00
001 60 95 Popescu M
5
00
002 60 95 Ionescu M
5
00
003 60 95 Georgescu F
5
00
005 60 95 Ion F
5
Dacă doriți să păstrați ambele valori de Id din fiecare set de date, puteți redenumi coloanele,
astfel:
PROC SQL;
SELECT tabela1.Id AS tabela1.Id ,
tabela2.Id AS tabela2.Id,
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1,
exemple. Tabela2;
QUIT;
Un produs cartezian este util în special atunci când doriți să efectuați potriviri între nume în
două tabele similare. Numărul de rânduri din tabelul rezultat este numărul de rânduri din primul
table înmulţit cu numărul de rânduri din al doilea tabel.
16
În programul care urmează, adăugăm o clauză WHERE pentru a selecta numai acele rânduri în
care numărul subiectului este același în cele două tabele. În afară de adăugarea unei clauze
WHERE, programul următor arată cum să se facă distincția între două coloane ambele cu acelaşi
nume.
PROC SQL;
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1 AS t1,
exemple. tabela2 AS t2
WHERE t1.Id EQ t2.Id ;
QUIT;
Numai subiecții care se află în ambele tabele sunt enumera ți. În terminologia SQL, aceasta se
numește o conexiune internă (inner join). Este echivalent cu o interclasare (merge) într-o etapă
DATA în care fiecare dintre cele două seturi de date contribuie la îmbinare.
PROC SORT DATA= exemple. tabela1 OUT= tab1;
BY Id;
RUN;
PROC SORT DATA= exemple. tabela2 OUT= tab2;
BY Id;
RUN;
DATA inner;
MERGE tab1 (IN=in1)
tab2 (IN=in2);
BY Id;
IF in1 AND in2;
RUN;
TITLE " Inner Join cu DATA Step";
PROC PRINT DATA=inner;
ID Id;
RUN;
Left, Right şi Full Joins
O alternativă este de a separa numele celor două tabele cu termenul INNER
JOIN
PROC SQL;
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
17
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1 AS t1 INNER JOIN
exemple. tabela2 AS t2
ON t1.Id EQ t2.Id ;
QUIT;
Una dintre regulile SQL este că atunci când se utilizează cuvântul cheie JOIN pentru a realize o
joncţiune între două tabele, se va folosi o clauză ON în locul unei clauze WHERE (după care
din rezultat se poate crea un subset cu o clauză WHERE).
LEFT JOIN include toate rândurile din prima (stânga) tabelă și acele rânduri din a doua tabelă
în care există o valoare corespunzătoare în primul tabel.
RIGHT JOINS include toate rândurile din tabelul 2 (dreapta) și numai rândurile potrivite din
primul tabel.
FULL JOINS include toate rândurile din ambele tabele (echivalent cu o MERGE într-un pas
DATA).
PROC SQL;
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1 AS t1,
exemple. tabela2 AS t2
WHERE t1.Id EQ t2.Id ;
QUIT;
PROC SQL;
TITLE "Left Join";
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Gen
FROM exemple.tabela1 AS t1 LEFT JOIN
18
exemple.tabela2 AS t2
ON t1.Id EQ t2.Id ;
TITLE "Right Join";
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Gen
FROM exemple.tabela1 AS t1 RIGHT JOIN
exemple.tabela2 AS t2;
ON t1.Id EQ t2.Id ;
TITLE "Full Join";
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Gen
FROM exemple.tabela1 AS t1 FULL JOIN
exemple.tabela2 AS t2
ON t1.Id EQ t2.Id ;
QUIT;
Într-un pas DATA, concatenarea a două seturi de date, se face denumindu-le într-o singură
instrucțiune SET.
În PROC SQL, se utilizează un operator UNION pentru a concatenarea rândurilor selectate din
cele două tabele.
Operator Descriere
Union Corespondenţa se face între poziția coloanei (nu cu numele coloanei) și
se elimină duplicatele
Union All Corespondenţa se face între poziția coloanei (nu cu numele coloanei) și
nu se elimină duplicatele
Union Corespondenţa se face între numele coloanei și se elimină duplicatele
Corresponding
Union All Corespondenţa se face între numele coloanei și nu se elimină duplicatele
Corresponding
Except Corespondenţa se face între numele coloanei și se elimină rândurile
gasite în ambele tabele
Intersection Corespondenţa se face între numele coloanei și se păstrează rândurile
unice din ambele tabele
19
Fie fişierele
Tabela1 Tabela2 Tabela3
Greutat Ge
Id Inaltime Id DataNasterii Nume Id Gen Nume DataNasterii
e n
00 155 68 001 10/15/1960 M Popescu 010 F Vasile 03/05/1977
1
00 250 74 002 08/01/1955 M Ionescu 013 M Andre 06/07/1999
3 i
00 110 63 003 12/25/1988 F Georgescu
4
00 95 60 005 05/28/1949 F Ion
5
Să presupunem că se doreşte să se adauge date din tabela 3 în setul de date tabela2 și noul set de
date să se numească tabela_rez folosind PROC SQL. (coloanele nu sunt în aceeași ordine cu
setul de date tabela 2.)
PROC SQL;
CREATE TABLE tabela_rez AS
SELECT *
FROM exemple.tabela2 UNION ALL CORRESPONDING
SELECT *
FROM exemple.tabela3
QUIT;
Se va obţine
Tabela_rez
Id DataNasterii Gen Nume
00 10/15/1960 M Popescu
1
00 08/01/1955 M Ionescu
2
00 12/25/1988 F Georgescu
3
00 05/28/1949 F Ion
5
010 03/05/1977 F Vasile
013 06/07/1999 M Andrei
Puteți utiliza funcții precum MEAN și SUM pentru a crea noi variabile care reprezintă medii sau
sume ale altor variabile.
De asemenea, puteți crea noi variabile în cadrul interogării.
20
Să presupunem că doriți să exprimați înălțimea fiecărei persoane în setul de date pentru sănătate
ca procent din înălțimea medie a tuturor subiecților (folosind un pas DATA, ar trebui mai întâi
să utilizați PROC MEANS pentru a crea un set de date care să conțină înălțimea medie. Veți
combina apoi cu setul de date original și efectuați calculul).
PROC SQL;
SELECT Id,
Inaltime,
Greutate,
MEAN(Inaltime) AS Inaltime_Medie,
100* Inaltime /CALCULATED Inaltime_Medie AS Procent_Inaltime
FROM exemple.tabela1
QUIT;
Înălțimea medie se calculează utilizând funcția MEAN. Această valoare este dată și variabilei
Inaltime_Medie. Când utilizați această variabilă într-un calcul, trebuie să o precede cu cuvântul
cheie CALCULATED, astfel încât PROC SQL să nu caute variabila într-unul din seturile de
date de intrare.
PROC SQL poate sorta tabelul dacă utilizați o clauză ORDER
PROC SQL;
SELECT Id,
Inaltime,
Greutate,
FROM exemple.tabela1
ORDER BY Inaltime;
QUIT;
2
00 12/25/1988 F Georgescu Ion F
3
00 05/28/1949 F Ion Ionesc M
5 u
21
SELECT Id,
t2.Nume AS tabela2_nume,
t4.Nume AS tabela4_nume
FROM exemple.tabela2 AS t2,
exemple.tabela4 AS t4
WHERE SPEDIS(tabela2_nume , tabela4_nume ) LE 25;
QUIT;
Masivele SAS sunt diferite de cele din multe alte limbaje de programare. Ele nu dețin valori și
permit referirea, într-o manieră convenabilă, la o colecție de variabile SAS.
22
II.12.1. Inlocuirea valorilor într-un set de date SAS
DATA date1;
SET exemple.date;
ARRAY matrice{3} Inaltime Greutate Varsta;
DO i = 1 TO 3;
IF matrice{i} = 999 THEN matrice{i} = .;
END;
DROP i;
RUN;
Puteți utiliza oricare dintre metodele de prescurtare SAS pentru a face trimitere la o listă de
variabile, cum ar fi Var1-Varn.
Numărul din paranteze care urmează după numele matricei se numește un indice, chiar dacă
nu este o notație adevărată a indexului
Prin plasarea matricei într-o buclă DO, puteți procesa fiecare variabilă în matrice.
De asemenea, deoarece nu aveți nevoie sau nu doriți ca contorul de buclă DO să fie inclus în
setul de date SAS, să utilizați o instrucțiune DROP.
Dacă doriți ca matricea să conțină variabile noi, trebuie să includeți un semn de dolar ($) și,
opțional, o lungime atunci când definiți matricea. De exemplu, pentru a crea o matrice de
variabile de tip caracter Q1-Q20, fiecare cu o lungime de 2 octeți, ați scrie următoarele:
Următorul program folosește o matrice de caractere pentru a converti toate valorile NA (nu se
aplică) sau semnul de întrebare (?) la o valoare lipsă SAS. Să presupunem că exista un set de
date SAS tabela5 și doriți să creați un nou set de date numit tabela_Lipsă cu aceste modificări.
DATA tabela_Lipsă;
SET exemple. tabela5;
ARRAY var_car {*} $ _CHARACTER_;
DO LOOP = 1 TO DIM(var_car);
IF var_car {LOOP} IN ('NA' '?') THEN
CALL MISSING(var_car {LOOP});
END;
DROP LOOP;
RUN;
23
Cuvântul cheie _CHARACTER_ este folosit ca listă de variabile. Deoarece această instrucțiune
urmează instrucțiunea SET, _CHARACTER_ include toate variabilele de caractere din setul de
date tabela5.
_CHARACTER_ menționează variabilele de caractere care sunt prezente în zona buffer la acel
moment din etapa DATA. De exemplu, dacă definiți variabilele de caractere A, B și C în primele
trei rânduri ale unui pas DATA și apoi folosiți referința _CHARACTER_ urmată de definirea
variabilelor de caractere D și E, numai variabilele A, B și C sunt menționate de către
_CHARACTER_ .
Dacă plasați instrucțiunea ARRAY înaintea instrucției SET, matricea nu face referință la nici o
variabilă.
Programul următor realizează conversia tuturor valorilor de caractere dintr-un set de date SAS la
litere mici.
DATA tabela_rez;
SET exemple.tabela6;
ARRAY matrice{*} _CHARACTER_;
DO i = 1 TO DIM(matrice);
matrice{i} = LOWCASE(matrice{i});
END;
DROP i;
RUN;
24
Setul de date Temp conține toate temperaturile de 24 de grade Fahrenheit și 24 de grade Celsius.
S-ar putea să vă întrebați de unde a apărut lista variabilelor în matricea FAHREN. Dacă omiteți
o listă de variabile într-o instrucțiune ARRAY și includeți numărul elementelor care urmează
numele matricei, SAS va crea automat nume de variabile pentru dvs., utilizând numele matricei
ca bază și adăugând numerele de la 1 la n, unde n este numărul elementelor din matrice.
În acest program, SAS creează variabilele Fahren1-Fahren24. Ați putea fi folosit această
caracteristică și pentru matricea Celsius.
Oricum, valorile din matricea temporară sunt reținute automat (adică nu sunt setate la valori lipsă
atunci când etapa DATA se repetă). Astfel, acestea sunt locuri utile pentru stocarea valorilor de
care aveți nevoie în timpul executării etapei DATA.
25
Începem cu un exemplu care utilizează o matrice temporară pentru a stoca răspunsul corect
pentru fiecare din cele 10 întrebări dintr-un test cu mai multe opțiuni. Apoi puteți puncta testul
utilizând matricea temporară ca şi cheie de răspuns. Iată programul:
Procedura PRINT va afişa atâtea coloane câte încap pe lăţimea paginii, iar cele care nu încap vor
fi afişate după terminarea tutror observaţiilor. In plus, va apărea o coloană (cu antetul Obs) care
va conţine numărul current al fiecărui rând de observaţii.
Declarația VAR permite specificarea variabilelor care vor fi afişate şi ordinea lor. De exemplu,
dacă dorim să afişăm numai variabilele Nume_ang, Nume_client şi Nume_client, se va folosi
codul:
Dacă se doreşte omiterea coloanei care conţine numărul current şi înlocuirea ei cu o altă
variabilă, se foloseşte opţiunea ID:
26
Variabila (sau variabilele) pe care le plasați în instrucțiunea ID înlocuiește coloana Obs și este
afişată în coloana cea mai din stânga ale înregistrării.
Când plasează un nume de variabilă în opţiunea ID, nu nu trebuie inclus și în instrucțiunea VAR
deoarece variabila va apărea de două ori în listă.
O modalitate alternativă de a omite coloana Obs este de a folosi PROC PRINT cu opțiunea
NOOBS. Avantajul utilizării unei instrucțiuni ID este că variabila ID va apărea pe fiecare pagină
dacă există mai multe variabile decât încap într-o singură pagină.
Se poate schimba aspectul valorilor din lista prin asocierea unui format cu una sau mai multe
variabile (SAS are multe formate încorporate care pot adăuga virgule sau semne de dolari în cifre
sau pot afișa date în diferite moduri). De exemplu se doreşte ca valorile Total_vanzari să apară
cu semne de dolari și virgule. Acest lucru se realizează cu o opţiunea FORMAT la lista
Total_vanzari cu semne de dolari și virgule și Cant cu virgule:
Se poate controla ce observații apar într-o listă prin includerea unei instrucțiuni WHERE în
procedură. De exemplu, dacă se doreşte ca listarea să conțină numai observații în cazul în care
cantitatea este mai mare de 400:
title "Raport Vânzări";
proc print data=tabela-vanzari;
where Cant gt 400;
ID Nume_ang;
VAR Nume_client Cant Total_vanzari;
format Total_vanzări dollar10.2 Cant comma7.;
run;
27
format Total_vanzări dollar10.2 Cant comma7.;
run;
In raport se pot adăuga linii de titlu suplimentare și una sau mai multe note de subsol.
Instrucțiunea TITLEn (unde n este un număr de la 1 la 10) permite să să se specifice mai multe
linii de titlu ( TITLE1 și TITLE sunt echivalente).
Pentru a anula titlurile sau notele anterioare se utilizează instrucţiunile title; şi footnote;
Dacă se doreşte ca afişarea să fie într-o anumită ordine preocedura PROC PRINT va fi precedată
de o procedură PROC SORT (pentru a vedea înregistrările în ordine descendentă se folose ste
cuvântul cheie DESCENDING,
proc sort data= tabela-vanzari;
by descending Total_vanzari;
run;
title "Raport Vânzări";
proc print data=tabela-vanzari;
ID Nume_ang;
VAR Nume_client Total_vanzari;
run;
28
by descending Total_vanzari;
run;
title "Raport Vânzări";
proc print data=tabela-vanzari;
ID Nume_ang;
VAR Nume_client Total_vanzari;
run;
Sortarea se poate realiza după mai multe variabile, de exemplu pentru ca observaţiile să fie
afişate în ordinea crescă toare a cos_angajat, iar pentru fiecare angajatm în ordinea
descrescătoare a vânzărilor, se poate folosi codul:
În mod implicit, raportul va conţine ca şi cap de table, numele variabilelor. Dacă se doreşte
utilizarea, în locul acestora, a etichetelor variabilelor se va utilize instrucţiunea LABEL (se va
utiliza o instrucțiune LABEL, fie în pasul DATA, fie o instrucțiune care urmează instrucțiunea
PROC PRINT. Se va adăuga o opțiune LABEL la instrucțiunea PROC PRINT).
Pentru a include o instrucțiune BY în PROC PRINT, setul de date trebuie să fie ordonat anterior
în aceeași ordine.
De exemplu, dacă se doreşte defalcarea raportului pe regiuni, mai întâi se sortează setul de date
pe regiuni și se include o declarație BY în PROC PRINT.
29
proc sort data= tabela-vanzari out=vanzări;
by Region;
run;
Prin includerea opțiunii N = în PROC PRINT, numărul total de observații din setul. de date se
imprimă în partea de jos a listei. Dacă se doreşte se poate utiliza formularea N = "eticheta dvs."
pentru a eticheta acest număr cu o etichetă aleasă de utilizator.
proc sort data= tabela-vanzari out=vanzări;
by Region;
run;
31
PROC PRINT uneori imprimă numele variabilelor pe verticală dacă numele variabilelor ocupă
mai mult spațiu decât următoarele linii de date. Dacă se doreşte ca PROC PRINT să mențină
numele variabilelor pe orizontală, se va include opțiunea HEADING = Horizontal (se poate
abrevia la HEADING = H) (proc print data= vanzări (obs=5) heading = horizontal;)
Procedura PROC REPORT permite controlul aspectului fiecărei coloane de raport, obţinerea de
rapoarte de sinteză și listări detaliate.
Opțiunea NOWD (fără ferestre) este o instrucțiune care face să nu se intre în editorul de ferestre
interactiv după ce executați procedura.
Pentru variabilele de tip caracter, lățimea coloanei este fie lungimea variabilei caracter, fie
lungimea valorii formatate (dacă variabila are un format).
Pentru variabilele numerice, lățimea coloanei implicite este de 9 ori lățimea unui format (dacă
variabila este formatată).
O altă diferență între PROC PRINT și PROC REPORT este că titlurile coloanelor implicite
pentru PROC PRINT sunt nume de variabile, iar titlurile coloanelor implicite pentru PROC
REPORT sunt etichete variabile (dacă există) sau nume de variabile dacă o variabilă nu are o
etichetă.
În plus, trebuie să listați variabilele pe care le creați în blocurile COMPUTE (discutate mai
târziu în acest capitol).
Spre deosebire de PROC PRINT, PROC REPORT este capabil să producă atât rapoarte
detaliate (lista tuturor observațiilor) cât și rapoarte sumarizate (raportarea statisticilor, cum ar fi
sumele – statistici implicite și medile).
Cu toate acestea, atunci când se include un mix de ambele tipuri de variabile într-un singur
raport, se obţine o listă detaliată care prezintă toate observațiile.
Puteți utiliza o instrucțiune DEFINE pentru a specifica modul de folosire al fiecarei variabile;
utilizați o listă a tuturor observațiilor și utilizați ANALIZA pentru a crea un raport sumar.
Dacă variabilele sunt numerice şi se doreşte un raport de sinteză se poate utilize un program ca:
TITLE "Raport de sinteza pentru variabile numerice";
PROC REPORT DATA=exemple.date1 NOWD;
COLUMN varsta greutate;
RUN;
Rezultat:
Raport de sinteza pentru variabile numerice
Varsta
elev greutate
40 210
Să presupunem că doriți o listă detaliată a fiecărei persoane din setul de date date1 în locul unui
raport de sinteză. Ați putea folosi următorul program:
există acum o instrucțiune DEFINE pentru fiecare dintre cele două variabile numerice
atributele pentru variabile sunt introduse ca opțiuni în instrucțiunea DEFINE (astfel, ele
urmează o bară după numele variabilei).
opțiunea DEFINE DISPLAY este o instrucțiune pentru a obține o listă detaliată a tuturor
observațiilor.
Pe lângă definirea utilizării ca DISPLAY, instrucțiunea DEFINE pentru varsta adaugă o
etichetă (plasată în ghilimele) și o lățime a coloanei.
Rezultatul este:
Raport detaliat pentru
Varsta
33
elev greutate
7 40
8 38
6 48
10 50
12 45
Să presupunem ca doriti să listaţi media vârstei şi media greutăţii elevilor grupaţi pe clase. Pentru
a face acest lucru, trebuie să utilizați opţiunea GROUP pentru variabila clasa. În plus, trebuie să
specificați MEAN ca statistică pentru varsta și greutate.
34
Opțiunea SPLIT = indică faptul că se doreşte ca la împărţirea comentariilor, între cuvinte să se
folosească spații libere. Fără această opțiune, PROC RAPORT ar folosi alte caractere, cum ar fi
slash-uri ca posibile pauze de linie.
Opțiunea RIGHT, utilizată pentru o variabilă, aliniază dreapta valorile acesteia. Alinierea
implicită pentru variabilele de tip alphanumeric este LEFT. Opțiunile de aliniere sunt LEFT,
RIGHT și CENTER.
35
36