1 Obliczenia na danych 1.1 Wyrażenia w SAS 1. stałe numeryczne, czyli liczby używane w wyrażeniach SAS. Możemy je prezentować (a) w zapisie standardowym np. 5, 6.7, -2.1, (b) w notacji naukowej np. 2e5 (czyli 2 10 5 = 200000), 3.4e 2 (czyli 0.034), (c) w zapisie szesnastkowym np. 3E8x (co oznacza 8 16 0 + 14 16 1 + 3 16 2 = 1000). 2. stałe znakowe - muszą być umieszczone w apostrofach, mogą zawierać od 1 do 32767 znaków. Możemy je prezentować (a) w zapisie standardowym ( Przykładowy napis ), (b) w zapisie szesnastkowym - ciąg heksadecymalnych znaków parzystej długości (np. A=41) umieszczony w POJEDYNCZYCH apostrofach. Pomocna może być ASCIITABLE. data test; c1="jakas stala znakowa w SAS ie"; c2= 4B6F6368616D20534153 x; Ex. 1. Korzystając z heksadecymalnej prezentacji stałej znakowej utworzyć w poprzednim przykładzie zmienną c3, która dla wszystkich obserwacji przyjmuje stałą wartość, np. swoje imię. 3. stałe daty i czasu - wprowadzona data jest jest dla systemu SAS liczbą dni od 1 stycznia 1960r do dnia podanej daty. Czas jest określony jako liczba sekund liczona od północy 1.01.1960r. do podanego momentu. Data i czas sprzed 1.01.1960 traktowane są jako liczby ujemne. data test1; jakas_data="25dec97"d; /*liczba dni od 1.01.1960*/ jakis_czas="10:00"t; /*liczba sekund od polnocy*/ inny_czas="03jan2000:23:15:30"dt; /*liczba sekund od polnocy 1.01.1960*/ 1
data _null_;/* nie tworzymy nowego zbioru danych */ jakis_czas="03:00"t; PUT "od polnocy minelo " jakis_czas "sekund"; Ex. 2. Ile dni minęło: (a) od dnia Twoich narodzin? (b) od dnia rozpoczęcia II wojny światowej? Proszę zapisać te informacje w logu. 4. operatory 2
2 Funkcje dokumentacja Funkcja w SAS to wbudowany algorytm służący do wykonywania obliczeń lub przkształceń na wskazanych argumetach i zwracająca pewne wartości (numeryczne bądź znakowe). Funkcje używane są w DATA stepach, w wyrażeniach z WHERE, w języku makr, w PROC REPORT oraz w SQL u. Również pewne statystyczne procedury używają SASowych funkcji. 2.1 Funkcje daty i czasu 3
DATA test2; data_edycji=today(); rok=year(today()); miesiac=month(today()); dzien=day(today()); dmy=cat(dzien,miesiac,rok);/*konkatenacja*/ /*keep data_edycji dmy; */ RUN; data terminy; input date :date9. item :$1.; datalines; 01APR2019 A 01AUG2011 B 01SEP2019 C 05MAY2018 D 20JUL2017 E ; data dnitygodnia; set terminy; wd=weekday(date); if wd=2 then dt="poniedzialek"; if wd=1 then dt="niedziela"; if wd=3 then dt="wtorek"; if wd=4 then dt="sroda"; if wd=5 then dt="czwartek"; if wd=6 then dt="piatek"; if wd=7 then dt="sobota"; /*przy okazji formatow nauczymy sie to robic bardziej finezyjnie*/ Ex. 3. Jaki dzień tygodnia był 1. w dniu Twoich narodzin? 2. w dniu rozpoczęcia II wojny światowej? Zapisać te informacje w logu. 4
2.2 Funkcje matematyczne, statystyczne, zaokrąglające proc transpose data=sashelp.class out=klasa_stat; var weight age height; data klasa_statystyka; set klasa_stat; suma=sum(of col1-col19); srednia=mean(of col1-col19); wariancja=var (of col1-col19); odch_st=std(of col1-col19); data klasa_statystyka1; set klasa_statystyka; keep _name_ suma srednia wariancja odch_st; 5
6
Ex. 4. Korzystając z tabeli baseball w bibliotece sashelp stworzyć tabelę, w której znajdować się będą: średnia, suma, wartość najmniejsza, wartość największa oraz liczba elementów będących brakami danych dla zmiennych: nouts, nassts, nerror, Salary. Za pomocą PROC MEANS można to zrobić trochę krócej proc print data=klasa_statystyka1; proc means data=sashelp.class (keep=weight age height ) sum var mean std ; 7
2.3 Funkcje znakowe Przeanalizować przykład 8
Ex. 5. Na podstawie zbioru sashelp.baseball stworzyć zbiór, który oprócz istniejących zmiennych będzie zawierał dodatkowe dwie zmienne Imie i Nazwisko powstałe na podstawie zmiennej Name. Wziąć pod uwagę imiona/nazwiska dwuczłonowe (obserwacja 41). 3 Funkcje specjalne LAG/LAGn - wartość zmiennej numerycznej z poprzedniej (ntej) obserwacji data one; input x @@; y=lag1(x); z=lag2(x); datalines; 1 2 3 4 5 6 ; /* a special symbol @@ is used to hold a line of data in the input buffer during multiple iterations of a DATA step.*/ DIF/DIFn - różnice między obs. aktualną, a wcześniejszą data two; input X @@; Z=lag(x); D=dif(x); datalines; 1 2 6 4 7 ; 9
Ex. 6. Posortować zbiór sashelp.class po zmiennej weight, a następnie stworzyć tabelę class diff ze zmienną weightdiff zawierająca różnice wagi między kolejnymi obserwacjami. Znaleźć minimalną oraz maksymalną różnicę. 3.1 PUT i INPUT PUT konwertuje: ˆ zmienną znakową na inną zmienna znakową Anna > Anna ˆ zmienną numeryczną na zmienną znakową o wartości numerycznej 20 > 20 data konwersja; set sashelp.air; nd=put(date,mmddyy10.); /*put(zm_num,format);*/ INPUT konwertuje: ˆ zmienną znakową o wartości numerycznej na zmienną numeryczną 20 > 20 ˆ zmienną znakową o wartości numerycznej na zmienną numeryczną (lub znakową) o podanym informacie 20, 678 > 20678, 20 > 20 data konwersja1; set konwersja; nd_num=input(nd,mmddyy10.); /*input(zm_znakowa,informat);*/. A na koniec 40 najbardziej popularnych instrukcji sasowych 10