Combinarea tabelelor SAS - econ.ubbcluj.rorodica.lung/sase/cursuri/FunctiiDo.pdf · Transformarea...

45
Combinarea tabelelor SAS [email protected] 9 ianuarie 2017 [email protected] Combinarea tabelelor SAS 9 ianuarie 2017 1 / 45

Transcript of Combinarea tabelelor SAS - econ.ubbcluj.rorodica.lung/sase/cursuri/FunctiiDo.pdf · Transformarea...

Combinarea tabelelor SAS

[email protected]

9 ianuarie 2017

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 1 / 45

Transformarea datelor folosind functii SAS

Obiective

convertirea de la tip caracter la tip numeric;

convertirea de la tip numeric la caracter;

crearea de valori de tip data;

extragerea lunii, anului sau a unui interval in valori SAS;

operatii cu variabile data/ora;

inlocuirea sau stergerea tuturor aparitiilor unui cuvant intr-un sir decaractere;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 2 / 45

Transformarea datelor folosind functii SAS

Tabela: Exemple de functii statistice

sum(arg1,arg2,...)mean(arg1,arg2,...)media valorilor nonmissingmin(arg1,arg2,...)max(arg1,arg2,...)var(arg1,arg2,...)std(arg1,arg2,...)

Cand o functie este referita, returneaza o valoare bazata pe argumentele ei,valoare care poate fi folosita apoi in diverse calcule.

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 3 / 45

Transformarea datelor folosind functii SAS

Forma generala a functiilor SAS

function-name(arg1,...)

unde arg pot sa fie variabile, constante sau expresii (chiar daca functia nuare argumente, trebuie pastrate parantezele() ).

Argumentele unei functii sunt separate cu virgule. Pentru unele functiise pot folosi ca argumente liste de variabile sau arrays precedate decuvantul cheie of (mean(of x1-x3))/ fara of SAS va calculamedia diferentei x1-x3.

Variabila care ia ca si valoare rezultatul functiei are lungimea stabilitaimplicit in functie de tipul functiei. Aceasta (lungimea) se poatemodifica cu instructiunea length.

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 4 / 45

Convertirea datelor cu ajutorul functiilor

Convertirea

datelor de la tip caracter la tip numeric se face cu functia input iar de latip numeric la tip caracter se face cu functia put. Cele doua functii se potomite cu riscul de eroare.

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 5 / 45

Convertirea datelor cu ajutorul functiilor

Convertirea automata de la tipul caracter la numeric

se incearca atunci cand o variabila de tip caracter este folosita in contextnumeric (de exemplu expresie artimetica). De exemplu, pentru tabelulhrd.temp de mai jos:

SAS dataset hrd.tempCity State Zip Phone StartDate EndDate PayRate Days HoursCARY NC 27513 6224549 14567 14621 10 11 88CARY NC 27513 6223251 14524 14565 8 25 200CHAPEL NC 27514 9974749 14570 14608 40 26 208HILL

putem scrie:

data hrd.newtemp;set hrd.temp;Salary=payrate*hours;run;

variabila payrate este de tip caracter; SAS va crea o variabila temporarain care pastreaza valorile numerice ale lui payrate; tipul lui payrate nuse schimba.SAS va emite un mesaj in LOG de fiecare data cand face o convertire automata

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 6 / 45

Convertirea datelor cu ajutorul functiilor

Convertirea automata

are loc atunci cand o valoare cu tipul caracter este:

atribuita unei variabile de tip numeric;

folosita intr-o expresie aritmetica;

comparata cu o valoare numerica folosindu-se un operator decomparare;

specificata ca argument al unei functii care foloseste doar argumentenumerice.

Conversia foloseste un informat de tip w.d unde w este latimea valoriiconvertite. (Se produce o valoare missing de fiecare data candvaloarea nu se conformeaza cu notatia citita.)

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 7 / 45

Convertirea datelor cu ajutorul functiilor

Instructiunea WHERE NU converteste automat incomparatii.

De exemplu:

data work.convtest;Number=4;Character=’4’;run;

proc print data=work.convtest;where character=4;run;

proc print data=work.convtest;where number=’4’;run;

conduce la mesaj de [email protected] Combinarea tabelelor SAS 9 ianuarie 2017 8 / 45

Convertirea datelor cu ajutorul functiilor

Convertirea explicita de la tip caracter la tip numeric

- se face folosind functia input cu forma generala:

input(sursa, informat)

unde sursa indica o valoare de tip caracter, constanta sau expresie deconvertit in valoare numerica iar informat se refera la un informatnumeric.

valoarea caracter informat2114333 7.

2,113,333 comma9.

Exemplu:

Test=input(saletest,comma9.);

converteste saletest in test care are tipul numeric si va putea fi folositin calcule.

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 9 / 45

Convertirea datelor cu ajutorul functiilor

Alt exemplu:

data hrd.newtemp;set hrd.temp;Salary=input(payrate,2.)*hours;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 10 / 45

Convertirea datelor cu ajutorul functiilor

Convertirea automata de la tipul numeric la tipul caracter

se face intotdeauna cand valori numerice sunt folosite intr-un context de tipcaracter. De exemplu:

cand se atribuie o valoare numerica unei variabile de tip caracter;

se foloseste o valoare numerica cu un operator care cere operand de tipcaracter (de exemplu operatorul de concatenare:siteCode=site||dept;);

specifica o valoare numerica folosita ca argument intr-o functie carecere argument caracter.

SAS foloseste format-ul best12. la convertire, ceea ce inseamna carezultatul va folosi 12 caractere. Daca valoarea numerica are mai putinecifre, rezultatul va fi completat cu spatii, ducand la posibile greseli.Si aici, la convertirea automata, SAS anunta in LOG acest lucru.

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 11 / 45

Convertirea datelor cu ajutorul functiilor

Convertirea explicita de la tipul numeric la tipul caracter

se face folosind functia put cu forma generala:

put(sursa, format)

unde:

sursa indica valoarea numerica de convertit;

format e un format care trebuie sa sa potriveasca cu valorile citite(de exemplu put(site,2.))

Functia put returneaza intotdeauna un sir caracter cu format.Exemplu:

data hrd.newtemp;set hrd.temp;Assignment=put(site,2.)||’/’||dept;run;

FARA PUT: datahrd.newtemp;set hrd.temp;Assignment=site||’/’||dept;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 12 / 45

Manipularea valorilor de tip data

Manipularea valorilor de tip data

SAS pastreaza datele ca si numar de zile trecute de la 1 ianuarie 1960(numar intreg) iar orele ca si numar de secunde trecute de la miezul noptii.Valorile de tip data/ora sunt salvate ca si numar de secunde trecute de la 1ianuarie 1960 si data si ora date.Valorile acestea sunt de tip numeric si pot fi folosite in calcule ca atare. Deexemplu:

data test(keep=name totday);set hrd.temp;TotDay=enddate-startdate;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 13 / 45

Manipularea valorilor de tip data

Functii SAS pentru valori de tip data

Cele mai folosite functii SAS pentru variabile de tip data sunt prezentate intabelul 2

Tabela: Functii pentru manipularea de date calendaristice

Functia Exemplu de folosire Rezultat

mdy data=mdy(mon,day,year); data in format SAStoday now=today(); data curenta in format SASdate now=date();time curtime=time(); ora curenta in format SAS

day day=day(date); ziua din luna (1-31)qtr quarter=qtr(date); trimestrulweekday wkday=weekday(date); ziua din saptamana (1-7)month month=month(date); luna (1-12)year yr=year(date); anul (4 cifre)

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 14 / 45

Manipularea valorilor de tip data

Functiile year, qtr, month si day

returneaza anul, trimestrul, luna sau ziua din data SAS.Forma generala:

YEAR(date)QTR(date)MONTH(date)DAY(date)

unde date este o data calendaristica in format SAS sau o constanta SAS.Exemplu: vrem sa filtram toate datele din hrd.temp despre cei angajati innoiembrie 1999:

data hrd.nov99;set hrd.temp;if year(startdate)=1999 and month(startdate)=11;proc print data=hrd.nov99;format startdate enddate date9.;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 15 / 45

Manipularea valorilor de tip data

Functia weekday

returneaza numarul zilei din saptamana:

weekday(data);

Exemplu: tabelul radio.sch contine programul postului de radio, iarvariabila airdate datele emisiilor. Programul alaturat creaza un tabelcare contine doar emisiunile de week-end

data radio.schwkend;set radio.sch;if weekday(airdate)=7 or weekday(airdate)=1;run;

Zilele saptamanii sunt numerotate de la 1 incepand cu duminica

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 16 / 45

Manipularea valorilor de tip data

Functia mdy

creeaza o data de tip SAS din valori numerice care reprezinta luna, ziua sianul:

mdy(luna, zi, an)

unde luna reprezinta luna sau un numar intre 1-12; ziua reprezinta ziuasau un numar de la 1-31 si year reprezinta anul sau un numar cu 2 sau 4cifre.Exemple

data hrd.newtemp(drop=month day year);set hrd.temp;Date=mdy(month,day,year);run;

proc print data=hrd.newtemp;format date date9.;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 17 / 45

Manipularea valorilor de tip data

data hrd.newtemp;set hrd.temp;DateCons=mdy(6,17,2002);run;proc print data=hrd.newtemp;format datecons date9.;run;

Daca data din mdy este invalida, SAS atribuie valoare missing

data dec.review98;set dec.review;ReviewDate=mdy(12,day,1998);run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 18 / 45

Manipularea valorilor de tip data

Functiile date si today

returneaza data curenta din sistem ca si data SAS. Au aceeasi forma si suntinterschimbabile.

date()today()

data hrd.newtemp;set hrd.temp;EditDate=date();run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 19 / 45

Functii pentru tipul caracter

Cele mai folosite functii pentru manipularea datelor de tip caracter suntprezentate mai jos:

SCAN returneaza un cuvant din sirul de caractereSUBSTR extrage un substring sau inlocuieste un caracter

(sau mai multe).TRIM taie spatiile de la sfarsitul sirului de caractereCATX concateneza mai multe siruri de caractere, inlatura

spatiile de la inceput si sfarsit si insereazaseparatori

INDEX cauta un caracter in sirul de caractereFIND cauta un substring de caractereUPCASE converteste tot sirul la majuscule.LOWCASE converteste tot sirul la minuscule.PROPCASE converteste prima litera a cuvintelor in

majuscule, restul minusculeTRANWRD inlocuieste sau sterge toate aparitiile unei

secvente de caractere din sir

Tema: de studiat fiecare din aceste functii din suportul de curs

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 20 / 45

Generarea de date cu cicluri do

Generarea de date cu cicluri do

Instructiunile din ciclurile do (for in alte limbaje de programare) se repetade mai multe ori in pasul data. Pot fi folosite pentru generarea datelor,executia conditionata a instructiunilor, citirea datelor.Obiective:

construirea de bucle do pentru a efectua calcule repetitive;

controlul executiei buclelor do

generarea de observatii multiple intr-o iteratie data

contruirea de bucle in bucle;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 21 / 45

Construirea buclelor do

Construirea buclelor do

DO index-variable=start TO stop BY increment;SAS statementsEND;

unde start, stop si increment:

sunt setate la intrarea in ciclu;

nu pot fi schimbate in cadrul ciclului (valoarea index-ului poate fimodificata in ciclu);

pot fi numere, variabile sau expresii SAS;

data finance.earnings;Amount=1000;Rate=.075/12;do month=1 to 12;Earned+(amount+earned)*(rate);end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 22 / 45

Construirea buclelor do

va crea urmatorul tabel SAS: in tabelul rezultat apare si variabila month- indexul

SAS Data Set Finance.EarningsAmount Rate month Earned1000 0.00625 13 77.6326

In tabelul finance.earnings se va scrie o singura observatie cu valorile rezultate inurma executiei de 12 ori a instructiunilor din buclaa do.Pentru a nu pastra index-ul:

data work.earn (drop=counter);Value=2000;do counter=1 to 20;Interest=value*.075;value+interest;Year+1;end;run;

Rezultatul:

SAS Data Set Work.EarnValue Interest Year8495.70 592.723 20

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 23 / 45

Construirea buclelor do

Pentru a crea o observatie

pentru fiecare iteratie do se foloseste instructiunea output. Exemplulanterior ar arata:

data work.earn;Value=2000;do Year=1 to 20;Interest=value*.075;value+interest;output;end;run;

si ar duce la crearea tabelului (partial):

SAS Data Set Work.Earn(Partial Listing)Value Year Interest2150.00 1 150.0002311.25 2 161.2502484.59 3 173.3442670.94 4 186.3452871.26 5 200.3203086.60 6 215.3443318.10 7 231.4953566.96 8 248.857... ... ...8495.70 20 592.723

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 24 / 45

Construirea buclelor do

Cicluri imbricate:

se pot executa cicluri do in interiorul altor cicluri do:

data work.earn;do year=1 to 20;Capital+2000;do month=1 to 12;Interest=capital*(.075/12);capital+interest;end;end;run;

pentru fiecare valoare a lui year, month va lua 12 valori

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 25 / 45

Construirea buclelor do

Procesarea datelor citite dintr-un tabel cu do.

Cu tabelul urmator (cdrates):

Institution Rate YearsMBNA America 0.0817 5Metropolitan Bank 0.0814 3Standard Pacific 0.0806 4

si

data work.compare(drop=i);set finance.cdrates;Investment=5000;do i=1 to years;investment+rate*investment;end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 26 / 45

Construirea buclelor do

obtinem:

SAS Data Set Work.CompareInstitution Rate Years InvestmentMBNA America 0.0817 5 7404.64Metropolitan Bank 0.0814 3 6323.09Standard Pacific 0.0806 4 6817.57

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 27 / 45

Executarea conditionata a buclelor do: until and while

DO UNTIL: se repeta instructiunile pana cand o expresieia valoarea adevarat

DO UNTIL(expression);more SAS statementsEND;

unde expression este o expresie SAS scrisa in paranteze.(expression nu este evaluata decat la sfarsitul buclei, de aceeainstructiunile din do until se vor executa cel putin o data. )

data work.invest;do until(Capital>=50000);capital+2000;capital+capital*.10;Year+1;end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 28 / 45

Executarea conditionata a buclelor do: until and while

va avea ca si rezultat:

SAS Data Set Work.InvestCapital Year53949.97 13

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 29 / 45

Executarea conditionata a buclelor do: until and while

Folosirea do while:

instructiunile se vor repeta cat timp o conditie este adevarata:

DO WHILE(expression);more SAS statementsEND;

expression este evaluata la inceputul buclei, deci daca are valoarea falsa,bucla nu se va executa niciodata.

data work.invest;do while(Capital>=50000);capital+2000;capital+capital*.10;Year+1;end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 30 / 45

Executarea conditionata a buclelor do: until and while

Combinarea variantelor de do

data work.invest(drop=i);do i=1 to 10 until(Capital>=50000);Year+1;capital+2000;capital+capital*.10;end;run;

se iese din bucla do cand i=11 sau capital>=50000 - care apare primaForma generala:

DO index-variable=start TO stop BY increment UNTIL(expression);DO index-variable=start TO stop BY increment WHILE(expression);

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 31 / 45

Crearea tablourilor unidimensionale

Array

Un tablou (array) SAS este o grupare temporara de variabile SAS sub unsingur nume. Un tablou va exista doar pe durata pasului DATA.Urmatoarele doua exemple conduc la acelasi rezultat:

data work.report;set master.temps;mon=5*(mon-32)/9;tue=5*(tue-32)/9;wed=5*(wed-32)/9;thr=5*(thr-32)/9;fri=5*(fri-32)/9;sat=5*(sat-32)/9;sun=5*(sun-32)/9;run;

7 variabile sunt convertite de la Farenheit la [email protected] Combinarea tabelelor SAS 9 ianuarie 2017 32 / 45

Crearea tablourilor unidimensionale

data work.report(drop=i);set master.temps;array wkday{7} mon tue wed thr fri sat sun;do i=1 to 7;

wkday{i}=5*(wkday{i}-32)/9;end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 33 / 45

Forma generala a array

Forma generala a array

ARRAY array-name{dimension} <elements>;

unde:

array-name este numele tabloului nou creat;

dimension e dimensiunea;

elements - optional - sunt variabilele de inclus in array; toate trebuiesa aiba acelasi tip. Daca nu sunt specificate, variabilele noi se vor creacu nume implicite;

nu se foloseste pentru numele tabloului nume de variabila deja folosita inpasul data si nici nume de functie SASNu se pot folosi tablouri in label, format, drop, keep saulength. (tablourile exista doar pe durata pasului data; nu se copiaza intabelul output)

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 34 / 45

Forma generala a array

De exemplu in tabelul finance.sales91 vreti sa procesati variabileleqtr1, qtr2, qtr3 si qtr4 in acelasi mod:

Descriptorul Finance.Sales91Variable Type LengthSalesRep char 8Qtr1 num 8Qtr2 num 8Qtr3 num 8Qtr4 num 8

vom folsi:

array sales{4} qtr1 qtr2 qtr3 qtr4;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 35 / 45

Forma generala a array

Specificarea dimensiunii

Pentru tablouri unidimensionale specificati numarul de elemente:

array sales{4} qtr1 qtr2 qtr3 qtr4;

sau specificati un interval:

array sales{96:99} totals96 totals97totals98 totals99;

sau lasati un * iar SAS va numara elementele care urmeaza:

array sales{*} qtr1 qtr2 qtr3 qtr4;

dimensiunea se scrie intre acolade sau paranteze patrate;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 36 / 45

Forma generala a array

Elementele

se pot enumera ca in exemplele de mai sus sau se pot da ca si interval devariabile daca numele lor permite asta:

array sales{4} qtr1-qtr4;

In plus se pot specifica si :

un interval de variabile numerotate Var1-Varntoate variabilele numerice _NUMERIC_totate variabilele de tip caracter _CHARACTER_toate variabilele _ALL_

Exemple:

array sales{*} _numeric_;array sales{*} _character_;array sales{*} _all_;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 37 / 45

Forma generala a array

Referirea elementelor din tablou

array-name{index}

unde index este pus intre paranteze sau acolade; reprezinta un intreg, ovariabila numerica sau expresie SAS numerica si este intre limita inferioarasi superioara a dimensiunii tabloului.

data work.report(drop=i);set master.temps;array wkday{7} mon tue wed thr fri sat sun;do i=1 to 7;if wkday{i}>95 then output;end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 38 / 45

Forma generala a array

data work.weights(drop=i);set master.class;array wt{6} w1-w6;do i=1 to 6;wt{i}=wt{i}*2.2;end;run;

data work.new(drop=i);set master.synyms;array term{9} also1-also9;do i=1 to 9;if term{i} ne ’ ’ then output;end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 39 / 45

Forma generala a array

va functiona si pentru tabloul de dimensiune 10:

data hrd.convert;set hrd.fitclass;array wt{*} weight1-weight10;do i=1 to dim(wt);wt{i}=wt{i}*2.2046;end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 40 / 45

Forma generala a array

Crearea de variabile in instructiunea array

Daca nu se da lista de elemente, SAS creaza variabilele din array:

array nume{dimensiune}

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 41 / 45

Forma generala a array

Exemplu

Vvrem sa calculam diferentele de greutate de la o saptamana la alta pentrufiecare membru al unui clubului de fitness, cu datele din tabelul de mai jos:

SAS Data Set Hrd.ConvertName Weight1 Weight2 Weight3 Weight4 Weight5 Weight6Alicia 153.4 151.9 151.7 148.6 145.5 145.9Betsy 116.0 116.0 114.0 111.1 109.8 108.2Brenda 151.2 149.0 147.7 146.4 145.1 143.7Carl 149.0 146.8 145.5 144.2 142.9 141.5Carmela 140.2 137.8 136.5 135.4 134.0 128.3

Vreti sa creati variabile care sa masoare aceste diferente saptamanale.

data hrd.diff;set hrd.convert;array wt{6} weight1-weight6;array WgtDiff{5};

Variabilele create implicit de SAS vor avea numele array urmat de unnumar pornind de la 1; in cazul nostru WgtDiff1, WgtDiff2,WgtDiff3, WgtDiff4, WgtDiff5.

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 42 / 45

Forma generala a array

Pentru a crea un tablou de variabile de tip caracter, se adauga un semn $dupa dimensiune

array firstname{5} $;

Implicit variabilele noi create vor avea dimensiunea 8. Se poate setadimensiunea :

array firstname{5} $ 24;

Continuarea exemplului de mai sus:

data hrd.diff;set hrd.convert;array wt{6} weight1-weight6;array WgtDiff{5};do i=1 to 5;wgtdiff{i}=wt{i+1}-wt{i};end;run;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 43 / 45

Forma generala a array

Va avea ca rezultat (partial):

SAS Data Set Hrd.DiffName WgtDiff1 WgtDiff2 WgtDiff3 WgtDiff4 WgtDiff5Alicia -1.54322 -0.22046 -3.08644 -3.08644 0.44092Betsy 0.00000 -1.98414 -2.86598 -1.32276 -1.54322Brenda -2.20460 -1.32276 -1.32276 -1.32276 -1.32276

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 44 / 45

Forma generala a array

Initializarea tablourilor

se poate face in definitie, de exemplu:

array goal{4} g1 g2 g3 g4 (9000 9300 9600 9900);array col{3} $ color1-color3 (’red’,’green’,’blue’);array Var{4} (1 2 3 4);

valorile se pun dupa elementele tabloului;

se initializeaza toate elementele;

se separa cu , sau spatiu;

valorile se pun intre paranteze;

[email protected] Combinarea tabelelor SAS 9 ianuarie 2017 45 / 45