%let path = /home/10sasdemo01/sasuser.viya/SZ00001; LIBNANE dane "&path"; data a; a = rand('Normal'); b = RAND('BERNoulli', 0.3); c = RAND('BETA', 0.3, 0.5); d = RAND('BINOmial', 0.5, 10); e = RAND('LOGNormal', 3, 1); f = RAND('NEGBinomial', 0.2, 19); g = RAND('POISson', 3); h = RAND('UNIForm'); i = RAND('UNIForm',2,5); run; proc print data=a;run; data b; do i = 1 to 10; a = rand('Uniform'); output; end; run; proc print; run; data c; a = "Ala ma kotka"; x = "Ala,ma,kota"; *b = Index(a, "kotka");/* pozycja jednego stringa w drugim */ *Imie = scan(a, 1); /* zwraca poszczegolne wyrazy */ *Zwierzak = scan(a, 3); *test = scan(x, 2, ','); *c = substr(a,5); *d = substr(a,5,2); *low = lowcase(a); *up = upcase(a); *prop = propcase(a); *change = tranwrd(a, "tka","ty"); *z = "S A S "; *zz = compress(z); fname = "Sebastian "; lname = "Zajac "; *fname_1 = trim(fname); /* prawa strona */ *fname_2 = strip(fname);/* left right */ person = fname||' '||lname; person2 = compbl(person); person3 = cat(fname,lname); rev = reverse(person2); q = quote(rev); run; proc print; title 'Napisy i ich przetwarzanie'; run; data a; set sashelp.class(keep=weight); x = lag(weight); y = lag2(weight); z= lag(x); run; proc print; title 'funkcja lag()'; run; /* dif n*/ data a; set sashelp.class(keep=weight); x = dif(weight); y = dif2(weight); run; proc print; title 'funkcja DIF()'; run; * 1 SCAN ; /* Syntax, SCAN function: SCAN(argument,n<,>) • argument specifies the character variable or expression to scan. • n specifies which word to return. • delimiters are special characters that must be enclosed in single quotation marks (' '). If you do not specify delimiters, default delimiters are used. */ data newnames(keep=name); set dane.staff; run; proc print;run; data newnames(drop=name); set dane.staff; lastname = scan(name,1); firstname = scan(name,2); run; proc print; run; data newnames(drop=name); set dane.staff; length firstname lastname $12.; lastname = scan(name,1); firstname = scan(name,2); run; proc print;run; /* SUBSTR SUBSTR(argument, position <,n>) • argument specifies the character variable or expression to scan. • position is the character position to start from. • n specifies the number of characters to extract. If n is omitted, all remaining characters are included in the substring. */ data work.agencyemp; set dane.agencyemp; length MiddleInitial $ 1; MiddleInitial=substr(middlename,1,1); run; proc print data=work.agencyemp; run; data work.temp2; set dane.temp; substr(phone,1,3)='433'; format startdate date9. enddate date9.; keep startdate enddate phone; run; proc print data=work.temp2; run; /* The SORT procedure does the following: • rearranges the observations in a SAS data set • creates a new SAS data set that contains the rearranged observations • replaces the original SAS data set by default • can sort on multiple variables • can sort in ascending or descending order • treats missing values as the smallest possible values Note: PROC SORT does not generate printed output. Syntax, PROC SORT step: PROC SORT DATA=SAS-data-set ; BY BY-variable(s); RUN; • The DATA= option specifies the data set to be read. • The OUT= option creates an output data set that contains the data in sorted order. • BY-variable(s) in the required BY statement specifies one or more variables whose values are used to sort the data. • The DESCENDING option in the BY statement sorts observations in descending order. If you have more that one variable in the BY statement, DESCENDING applies only to the variable that immediately follows it. */ data zbior; input x y; cards; 2 3 24 25 23 25 2 4 23 22 1 2 1 2 ; run; proc print;run; /* Sortowanie w jezyku 4GL wykonuje sie za pomoca procedury SORT. Jej najprostszy wariant skladniowy wyglada tak: */ proc sort data=zbior; by x; run; proc sort data=zbior out=zbiors; by x; run; proc print;run; proc sort data=zbior out=zbiors; by x y ; run; proc print;run; /* Chcac odwrocic porzadek sortowania, nalezy napisac tak: */ proc sort data=zbior out=zbiors; by descending x; run; proc print;run; /* Istnieje mozliwosc pozbycia sie powtarzajacych sie wartosci obserwacji: */ proc sort data=zbior out=zbiors nodup; by /*descending*/ x; run; proc print;run; /* A takze powtarzajacych sie wartosci klucza: */ proc sort data=zbior out=a; by x; run;proc print; run; proc sort data=zbior out=zbiors nodupkey; by /*descending*/ x ; run;proc print;run; /* Dokladniej, znaczy to tyle, ze sposrod obserwacji o powtarzajacej sie wartosci klucza zapisana jest pierwsza. */ /* Nalezy zdawac sobie sprawe z pewnej wlasnosci implementacji sortowania w 4GL. Wszystko bedzie dobrze widoczne na ponizszym zbiorze: */ data a; input x y; cards; 1 2 0 2 1 3 1 2 9 8 ; run; proc print; /* Chcac usunac duplikaty, wykonujemy ponizszy DATA Step: */ proc sort data=a out=as nodup; by x; run; proc print; /* Tymczasem, poniewaz NODUPRECS sprawdza jedynie kolejne obserwacje, niektore niekolejne obserwacje powtarzajace sie moga pozostac w zbiorze wynikowym. Rada na to jest sortowanie po wszystkich zmiennych: */ proc sort data=a out=as nodup; by x y; run; proc print; /* Oczywiscie, mozliwe sa kombinacje w porzadku sortowania klucza: */ proc sort data=a out=as nodup; by x descending y; run; proc print; /* Zwrocmy uwage na to, ze SAS nie wykonuje niepotrzebnych sortowan, tzn. nie sortuje zbioru, ktory juz kiedys posortowal i od tamtego czasu go nie modyfikowal. Oto stosowny przyklad: */ proc sort data=a out=aposort; by x; run; proc sort data=aposort; by x; run; /* Zwrocmy uwage na komunikat wyswietlany w okienku Log. Skad SAS wie, ze zbior APOSORT byl juz sortowany? Ta i inne informacje o zbiorze moga byc odkryte za pomoca procedury CONTENTS: */ proc contents data=aposort out=info; run; proc sort data=dane.admit out=work.wgtadmit; by weight age; run; proc print data=work.wgtadmit; var weight age height fee; where age>30; run; data pl; input wyrazy $ napis $; cards; żaba zaba ćma cma żywioł zywiol źrenica zrenica ławka lawka ; run; proc print;run; proc sort data=pl out=pls; by napis; run; proc print;run; proc sort data=pl out=pls; by wyrazy; run; proc print;run; proc sort data=pl sortseq=polish; by wyrazy; run; proc print;run; /* Konwersja danych tekst -> numeryczny numeryczny -> tekstowy str() list() dict() */ /* NIEJAWNA */ /* jeśli jest odpowiedni kontekst to zmiany wykonywane są automatycznie */ data result; length numeric 8; text='100'; numeric=text; text=numeric*2; /* jaki bedzie log ? */ run; proc print;run; /* JAWNA PUT(zmienna, format) - numeric -> tekst INPUT(zmienna, informat) - tekst -> numeric */ data wyr; numeric=15; text1='1,200.20'; text2=put(numeric, z4.); numeric2=input(text1, comma8.2); run;