SAS BASE. Программирование на языке SAS BASE. Основы (1185351), страница 2
Текст из файла (страница 2)
Для числовых значений:0 или . = Falseвсё остальное = True( . – это пропущенное значение, missing)2. Операторы min (><) и max (<>):если A<B, то A><B вернёт значение A3. Оператор конкатенации для символьныхзначений:'grade '||'A'Этот оператор не обрабатывает пробелы, которыемогут содержаться в переменных. Особенностьхранения символьных переменных: значениядобиваются пробелами справа до максимальногоразмера переменной (см атриб.
length)Вхождение в список: state in ('NY','NJ','PA')19Действия с переменными на шаге DATAИзменение значения переменной (или создание новой переменной):26 data employees;27set employee_list;28if upcase(Country)='US' then Bonus = 500;29else Bonus=0;30 run;При компиляции в оперативной памяти формируется специальнаяструктура данных – Program Data Vector, который содержит место длявсех переменных, имеющихся внутри шага DATA. Если Bonus был вemployee_list – его свойства берутся оттуда, если нет – в PDV появляетсяновая переменная.Откуда берутся свойства новой переменной?1.
Можно явно задавать самим (напр., тип, формат, длину)2. Если они не заданы явно, то берутся свойства по умолчанию или изконтекста программы (длина, тип)3. При использовании функций – задаются самой функцией (тип,длина).* См. SAS(R) 9.3 Language Reference: Dictionary20Операторы условного перехода1. Выполнение нескольких операторов в одной ветви условногоперехода:IF expression THEN do;…;…;…;end;<ELSE do;…;end;>2.
Ещё один вариант условного перехода (аналог switch-case):SELECT<(select-expression)>;WHEN (when-expression-1) statement;<WHEN (when-expression-n) statement;><OTHERWISE statement;>END;Задание – найти справку по select-when и посмотреть примеры кода.21Функции*Функции – это подпрограммы, которые возвращают одно значениеfunction-name (argument-1<, …argument-n>)function-name (OF шаблон-названия)Могут применяться на шаге DATA и PROC (например, в условиях-фильтрах)Примеры функций:SUM(argument,argument,... ) – сумма аргументов (пропущенные значения игнор.)Sum и оператор «+» могут работать 41 data temp;in_tab42set in_tab;по разному.
Чему равны a1 и a2B (Num) C (Num)43a1=b+c;в temp?44a2=sum(b,c); .145 run;UPCASE(argument) – перевод символьной строки в верхний регистрPUT(source, format.) – перевод числового аргумента в символьный сисползованием формата (format)INPUT(source,informat.) – перевод символьного аргумента в числовой сиспользованием формата для ввода (informat)Функции можно применять друг к другу без создания промежуточных переменных* Справка: SAS(R) 9.3 Functions and CALL Routines: Reference22Функции для даты и времениВнутренний формат даты в SAS – число дней с 01 января 1960 годаВнутренний формат времени – число секунд с полуночиВнутренний формат временной метки (datetime) – число секунд с полуночи 01 января 1960годаДля работы с такими данными (все хранятся в переменных числового типа) есть, в частности,функции:DATEDATEPARTDATETIMEDAYDHMSHMSHOURINTCKINTNXMDYMINUTEMONTHQTRSECONDTIMETIMEPARTTODAYWEEKWEEKDAYYEARYRDIFТекущая дата во внутр.
ФорматеИзвлекает часть, содержащую дату, из временной меткиТекущая дата/время (timestamp)Число из даты во внутр. формате: day ( ’01jan2013’d ) -> 1 ; day (19359) -> 1Returns a SAS datetime value from date, hour, minute, and second values.Returns a SAS time value from hour, minute, and second values.Час из внутр. формата времени или временной меткиКоличество временных промежутков, укладывающихся на данный интервал (годы, месяцы, недели …)Increments a date, time, or datetime value by a given time interval, and returns a date, time, or datetime value.Дата во внутреннем формате из месяца, числа, года: Mdy(1,1,2013) -> 19359минуты из внутр.
формата времени или временной меткиМесяц из внутр. формата датыReturns the quarter of the year from a SAS date value.Returns the second from a SAS time or datetime value.Returns the current time of day as a numeric SAS time value.Извлекает часть, содержащую время, из временной меткиТекущая дата во внутр. формате датыНомер недели из внутр. формата датыДень недели из внутр. формата датыГод из внутр. формата датыReturns the difference in years between two dates according to specified day count conventions; returns a person’s age.23Формат*• Это правило для вывода данных1 data test;2x=19359;3y=19359;4format y ddmmyy.;5z1=put(x,ddmmyy.);6z2=input(z1,ddmmyy10.);7 run;Информация о формате(для переменной Y)сохраняется в дескрипторенабора данных.Числовой типПреобразовали числов строку символовТоже числовой тип, новыводится как дата… и наоборот1) При применении формата сами данные не меняются (переменная y - число)2) Формат в SAS – это не только форматирование данных, но и метод табличногопоиска (создание и поддержка централизованных справочников).
Частоприменяется, чтобы избежать хранение избыточных данных.3) Шаблоны для вывода на экран можно создавать самому (proc format, Tasks ->Data -> Create format … ).* см. SAS(R) 9.3 Formats and Informats: Reference24Вывод наблюдений в наборы данных1 data test1 test2;А2x=19359;Б3output test1;В4x=19360;Г5output test1 test2; * output ;6format x ddmmyy.;7 run;Компиляция:1) Формирование PDV (только 1 переменная: х),2) Формирование дескрипторов наборов данных test1, test23) Информация о формате записана в дескрипторы test1 и test2Выполнение:А) Заносим х=19359 в PDV,Б) Сбрасываем содержимое PDV в test1 (явный оператор output)В) Заносим х=19360 в PDV,Г) Сбрасываем PDV в test1, test2 (явный оператор output)Д) Завершение шага DATA25Опции набора данных(keep, drop, where, end)1 data test1 (keep=x y);Опция набора данных – в test1 будут выведены2x=today();только x,y3y=datetime();ИЛИ4z=time();Оператор keep - во все наборы данных будут5keep x y;6 run;выведены только x,yKeep: оставить в наборе данных только указанные переменныеDrop: оставить все переменные за исключением указанных1 data test;2set ecprg1.accounts3(where=(Employee_ID between 11000 and 11999));4 run;Опция во входящем наборе данных, фильтрация при чтении данных(если в новом наборе данных – при записи)1 data test;2set ecprg1.accounts3(rename=(account=code));4 run;Опция работает в исходящем и входящем наборе данных,переменная account будет переименована в code (в данном случаев PDV и исходящем наборе данных)26Программирование на языкеSAS BASEЛекция 2.
Основы.Звежинский Дмитрий,SAS Russia/CISdmitry.zvezhinsky@sas.comЗамечания об ошибках и опечатках просьба направлять лектору.Установка SAS on-demandP.S. Если к Вам будут обращаться спроблемами установки, может быть поможет:При инсталляции клиента возникла ошибка,требовалось установить .NET Framework 4. Ноэто не помогло, ровно как и SP1. Помоглаустановка языкового пакетаhttp://www.microsoft.com/ruru/download/details.aspx?id=332428Циклы DOВывести в набор данных целые цифры от 1 до 5 (включительно)1.123456782.
9101112131415163. 1718192021data test;n=0;do until(n>=5);n+1;output;end;run;data test;n=0;do while(n<5);n+1;output;end;run;data test;do n=1 to 5;output;end;run;По умолчанию новая переменнаяинициализируется пропущенным значениемВ данном случае – то же, что n=n+1;Условие проверяется в конце циклаУсловие проверяется в начале циклаА если хочется, можно вообще безциклов:1 data test;2 n=1;3lbl1:4output;5n=n+1;6if n<=5 then go to lbl1;297 run;Особенности шага Data• Тип переменной и её «длина» (атрибут length)числоваясимвольнаяlength a 4;length a $ 4;x=a;x=a;x1='ABCDE';Вопрос: какая длина будет у переменных? А какое значение?При выполнении оператора “=“:• Длина числовой переменной по умолчанию 8 байт• Длина символьной «наследуется».30Особенности шага Data• Посмотрим две программы:№1№2data test;set work.test1;run;data test;set work.test1;set work.test1;run;Work.test• Вопросы: а) когда закончится выполнение программ?• б) сколько итераций сделает цикл в каждой программе?• в) будет ли отличаться результат?Смотрим в log:NOTE: There were 2 observations read from the data set WORK.TEST1.NOTE: The data set WORK.TEST has 2 observations and 2 variables.NOTE: DATA statement used (Total process time):real time0.00 secondscpu time0.00 seconds...NOTE: There were 2 observations read from the data set WORK.TEST1.NOTE: There were 2 observations read from the data set WORK.TEST1.NOTE: The data set WORK.TEST has 2 observations and 2 variables.Первыйшаг dataВторойшаг data31Особенности шага Data• Как работает эта программа?data test;set work.test1;set work.test1;run;Итерация 1.Первый set: записывает первое наблюдение test1 в PDVВторой set: записывает первое наблюдение test1 в PDVНеявный оператор output (Содержимое PDV переносится в новый набор данных)Неявный оператор returnИтерация 2.Первый set: записывает второе наблюдение test1 в PDVВторой set: записывает второе наблюдение test1 в PDVНеявный оператор output (Содержимое PDV переносится в новый набор данных)Неявный оператор returnИтерация 3.Первый set: наткнулись на конец файла, шаг data закончен.Оператор put выводит в log содержимое одной или нескольких переменных PDV32Набегающие суммы• Пример: каким образом пронумеровать наблюдения?123456789101112131415161718data test;ctr=0;Выводит значение переменной в logput ctr=;set ecprg1.contacts;ctr=ctr+1;Просмотр содержимого PDV (в log)put _all_;run;data test;retain ctr 0;set ecprg1.contacts;ctr=ctr+1;run;Не работаетСоздается новая переменная ctr,инициализируется нулём, её значение не будетсбрасываться в missing в начале каждой итерациишага DATAdata test;set ecprg1.contacts; Эта запись – аналог двух операторов впредыдущей программе (retain и увеличениеctr+1;счетчика)run;33Сортировка наборов данных (Proc SORT)123456718293104115126proc sort data=ecprg1.contacts out=tempsort;by descending name;Куда будет выведенrun;отсортированный набор данных?procsort data=ecprg1.nonsalesdupes(keep=employee_idВходящий набор данных first last)По какимпеременнымdupout=dup1 out=nondup1 NODUPKEY;сортировать?by employee_id;proc sort data=ecprg1.contacts out=tempsort;run;by descending name;procsort data=ecprg1.nonsalesdupes(keep=employee_idfirst last)run;Proc SORTумеет искать и выделять дубликаты:dupout=dup2 out=nondup2 NODUPRECS;employee_id;proc sortbydata=ecprg1.nonsalesdupes(keep=employee_idfirst last)Аdupout=dup1 out=nondup1 NODUPKEY;run;7by employee_id;8 run;9 proc sort data=ecprg1.nonsalesdupes(keep=employee_id first last)10dupout=dup2 out=nondup2 NODUPRECS;11by employee_id;12 run;БА: Дубликатами считаются записи с одинаковым значением employee_id.Дубликаты выводятся в набор данных dup1, все остальные записи – в nondup1Б: Дубликатами считаются записи, если они полностью совпадают друг с другом(все поля, которые мы читаем из nonsalesdupes: employee_id, first, last)34Оператор by (шаг DATA)•Если набор данных отсортирован по некоторой переменной, на шаге DATA мыможем работать с маркерами начала и конца группы наблюдений с одним и темже значением этой переменной.Пример:Как посчитать сумму Quantityдля каждого Customer_ID?1234567891011proc sort data=ecprg1.usorders04 out=usord_sort;by customer_id;run;data summary_cust (keep=sum customer_id);set usord_sort;by customer_id;if first.customer_id=1 then sum=0;sum+quantity;if last.customer_id then output;run;Сортировка!First.variable = 1 для первогонаблюдения в группе, =0 длядругих наблюдений,Last.variable =1 для последнегонаблюдения в группе, =0 длядругих наблюдений35Операторы where, if(создание выборки на шаге DATA)• Оператор where (как и опция набора данных where) работает только спеременными, которые уже есть во входящем наборе данных.• Оператор where работает не только на шаге DATA, но и в процедурах.• If работает со всеми переменными, которые присутствуют в PDV, в томчисле со служебными и «новыми»Задача: выбрать наблюдения, где product_list начинается сцифр 2112345678910data plist1;set ecprg1.product_list;where product_id between 210000000000 and 219999999999 ;run;data plist2;set ecprg1.product_list;two_digits=int(product_id/10000000000);if two_digits = 21 ;run;В первом случае мы используем для фильтрации оператор where и переменную,которая уже есть во входящем наборе данных.