Лекция 1. Программирование на языке SAS. Основы шага DATA (1185373), страница 2
Текст из файла (страница 2)
Будьте осторожный с пропусками в строках!!!20Библиотеки• Возникли как подход к централизованному хранению ипрозрачному использованию данных в программах SASСамый простой случай библиотеки –это наборы данных, находящиеся водной директории.При запуске SAS сразу имеетсянесколько служебных библиотек,временная библиотека Work (онабудет очищена при отключении отсервера или завершении процессаsas.exe) и персональная библиотекаSasuser (данные хранятся постоянно).В качестве библиотек можно подключать данные, которые физически находятсяне в формате наборов данных SAS (промышленные БД, excel, access). Длябольшей части вашей программы будет всё равно, как (и где) данные хранятся.21Подключение библиотеки в SAS UE1.
Копируете директорию снаборами данных в директорию…./SASUniversityEdition/myfoldersОткрываете меню “My Folders”.2. В SAS Studioсоздаёте библиотекучерез меню.22Создание библиотек• Подключение библиотеки может производиться программным путём(оператор libname):libname mylib ‘folders/myfolders‘;mylib - название библиотеки: 0-9, a-z, _, не может начинаться с цифры, не более 8символов длиной• Подключенная таким образом библиотека «живет» до завершениясеанса (для SAS U - до “Sign out”, если не включить волшебную галочкупри создании библиотеки)• Теперь в программе можно обращаться к набору данных не указываяполный путь, а с помощью 2-х уровневого имени (которое записываетсячерез точку):.testdatasetmylibЕсли первая часть не указана – предполагается библиотека WorkСодержимое библиотеки можно посмотреть с помощью процедуры:proc contents data=mylib._all_;run;где mylib – имя библиотеки231234567891011121314151617Программа на языке SAS Baseoptions linesize=95 pagesize=52;data work.NewSalesEmps;length First_Name $ 12 Last_Name $ 18Job_Title $ 25;infile 'newemps.csv' dlm=',';input First_Name $ Last_Name $Job_Title $ Salary;run;proc print data=work.NewSalesEmps;run;proc means data=work.NewSalesEmps;class Job_Title;var Salary;run;24Оператор options• Глобальный – действует на всю программу• Но может встречаться несколько раз, «переключая» опциимежду шагами• В общем случае зависит от ОС и среды выполнения SASпрограммы• Может много чего:• Задавать параметры вывода и журанала (в том числе для отладочнойинформации)• Задвайть ограничения на количество информации для чтения/записи• Настраивать параметры для времени и даты• Управлять памятью• И много чего другого• Значения настроек можно получать через функцию GETOPTIONS25Программа на языке SAS Base• Программа не требует явного подключения «библиотек» спроцедурами, которые есть в установленном дистрибутиве SAS (аля «#include»), но может подключать внешние файлы с SASкодом на этапе работы макропроцессора(%include)• Программа «по шагам»• Минимальный «фрагмент» программы, который SAS можетвыполнить, это один шаг (начинается с операторов «data» или«proc»)• В интерактивном режиме можно выполнить один или несколькошагов программы (выделить код мышкой и нажать кнопку RUN)• Каждый оператор должен заканчиваться «;»• Каждый шаг должен заканчиваться операторами «run;», «quit;»,или началом следующего шага• Форматирование свободное (программу можно записать в однустроку, оператор можно разбивать на несколько строк)26Шаг DATA• Обработку данных нужно было делать ещё до того, как был принят стандарт SQL(wiki: в 1986 году первый стандарт языка SQL был принят ANSI, SAS развивается с1966г, с 1976 как коммерческий продукт).• Шаг DATA дополняет SQL и наоборот (SQL – работа с множеством наблюдений,шаг DATA – работа с единичными наблюдениями).
Чем пользоваться дляконкретных целей – нужно думать.• Шаг DATA очень часто требует существенно меньше ресурсов по сравнению с SQL(важно если данных много), но нужно изучить логику его работы, которая бываетнетривиальной.• Позволяет создавать и манипулировать наборами данных SAS (включая запись,чтение наборов данных, чтение необработанных данных, изменение структуры,создание агрегатов, объединение таблиц, фильтрацию наблюдений, можноиспользовать условные переходы, циклы, вызов пользовательских и встроенныхфункций, ...).• Мы посмотрим малую часть того, что может шаг DATA.
Справка по DATA STEP:• SAS(R) 9.3 Language Reference: Concepts, Second Edition -> DATA Step Concepts• SAS(R) 9.3 Language Reference: Concepts, Second Edition -> Dictionary ofLanguage Elements -> SAS Data Set Options27Шаг DATAСамая простая операция – создание копии набора данных:26 data employees;новый набор данных27set employee_list;исходный набор данных28 run;Что происходит при запуске такого шага?(см. Overview of DATA Step Processing: Flow ofAction)1) Фаза «компиляции»:- проверка синтаксиса- создание вектора данных (Program Data Vector,PDV) – области в памяти, где хранятсязначения переменных для одногонаблюдения (строчки) из исходного набораданных, включая новые и служебныепеременные.- создание дескриптора (служебной части) длянового набора данных (хранит информацию отипах, названиях переменных, свойства28набора данных и проч.)Шаг DATAЧто происходит после фазы «компиляции»?26 data employees;27set employee_list;28 run;Ошибок в синтаксисе нетНазвания, типы и свойства переменных взяты из исходной таблицы на фазе компиляцииPDV:(в памяти)employees:(на диске)VAR1 VAR2 VAR3 ………Data Set Name…Observations…Member Type…Variables..Engine..Indexes…Created…Observation Length…Last Modified…Deleted Observations…VAR1 (Num)VAR2 (Char)………VAR3 (Num)2) Фаза «выполнения» – выполнение “цикла” внутри шага data.
Однаитерация цикла – это обработка одного наблюдения (строчки)У нас он состоит только из одного оператора SET и неявных операторов,которых мы в программе не видим.Вопрос: Когда этот цикл закончится?29Оператор SET0. Проверка на достижение конца исх. файла1. Явный оператор Set = Чтение одногонаблюдения из Employee_list в PDV2. Неявный оператор Output = сброссодержимого PDV в employees3. Неявный оператор Return = возврат кначалу цикла внутри шага DATA26 data employees;27set employee_list;28 run;employeesData Set Name…Observations…Member Type…Variables..Engine..Indexes…Created…Observation Length…Last Modified…Deleted Observations…VAR1 (Num)Employee_listPDVVAR1 VAR2 VAR3132AAABBBCCC 202201200Data Set Name…Observations…Member Type…Variables..Engine..Indexes…Created…Observation Length…Last Modified…Deleted Observations…VAR2 (Char)VAR3 (Num)VAR1 (Num)VAR2 (Char)VAR3 (Num)1AAA2001AAA2002BBB2012BBB2013CCC2023CCC20230Операторы условного выполненияВыполнение нескольких операторов в одной ветви условного переходана шаге DATA:IF expression THEN do;…;…;end;ELSE do;…;end;Ещё один вариант условного выполнения (аналог switch-case):SELECT<(select-expression)>;WHEN (when-expression-1) statement;<WHEN (when-expression-n) statement;><OTHERWISE statement;>END;31Дополнительные возможности по управлениюна шаге DATA• Не записывать текущий PDV в выходной набор данных и перейти кследующему наблюдению – оператор DELETE, например:IF condition THEN; эквивалентно IF not(condition) THEN DELETE;• Записать текущий PDV в выходной набор данных (если явно не вызывалсяOUTPUT) и перейти к следующему наблюдению – оператор RETURN• Остановить цикл обработки наблюдений – оператор STOP, например:DATA …;…;IF condition THEN RETURN; ELSE STOP;run;• Специальная переменная _N_ - номер итерацииНапример, IF _N_=1 THEN инициализация чего-то;• Специальная опция END= для входного набора данных задает имяпеременной с признаком конца набора, аналогичноset test1(end=mycheck);…;IF mychek THEN действия для последней итерации;32Циклы 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;7 run;33Циклы DO• Можно комбинировать to и while или until, например:do i=1 to 10 while (j ne 2)• Можно списки задавать явно перечислением:do i=1,2,5,7,99; или do s=‘1,2’, ’abs’, ‘1e99’;• LEAVE – выход из цикла, CONTINUE – следующая итерация• Можно использовать GOTO для выхода из цикла• Можно менять индексную переменную, например:do i=1,2,5,7,99;if i eq 5 then i=98;put i=;end;Выведет: i=1 i=2 i=98 i=7 i=99, пройдя все итерации, аdo i=1 to 5;if i eq 3 then i=98;put i=;end;Выведет: i=1 i=2 i=98, пройдя три итерации, и выйдя за границы лиапазона34Действия с переменными на шаге DATAИзменение значения переменной (или создание новой переменной):26 data employees;27set employee_list;28if upcase(Country)='US' then Bonus = 500;29else Bonus=0;30 run;При компиляции в оперативной памяти формируется Program DataVector, который содержит место для всех переменных, имеющихсявнутри шага DATA.