Лекция 2. Программирование на языке SAS. Основы шага DATA (Лекции 2015)
Описание файла
Файл "Лекция 2. Программирование на языке SAS. Основы шага DATA" внутри архива находится в папке "Лекции 2015". PDF-файл из архива "Лекции 2015", который расположен в категории "". Всё это находится в предмете "(ппп соиад) (sas) пакеты прикладных программ для статистической обработки и анализа данных" из 10 семестр (2 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Программирование на языкеSASЛекция 2 (Основы шага DATA)Авторы материалов:Звежинский Дмитрий (SAS Russia/CIS), dmitry.zvezhinsky@sas.comПетровский Михаил (ВМК МГУ, SAS Russia/CIS), michael@cs.msu.su1Опции набора данных (как входных так ивыходных) keep, drop, rename, where1 data test1 (keep=x y);Опция набора данных – в test1 будут выведены2x=today();только x,y3y=datetime();ИЛИ4z=time();Опции keep, drop, where и rename могут быть5keep x y;использованы как операторы для всех наборов6 run;выводимых данныхKeep: оставить в наборе данных только указанные переменные (через пробел)Drop: оставить все переменные за исключением указанных (через пробел)Переменные, указанные в свойствах DROP (не указанные в KEEP) входныхнаборов данных, не попадают в PDV, а в свойствах выходных (или воператорах) попадают, но не записываются!1 data test;2set ecprg1.accounts3(rename=(account=code));4 run;Опция работает в исходящем и входящем наборе данных,переменная account будет переименована в codeЧаще всего используется в merge (либо для определенияуникального ключа из разноименных переменных, либо наоборотдля «разведения» одноименных, но разных переменных)2Управление вводом переменныхФайл с необработаннымиданнымиВходной набор данных SASПрименение параметров DROP=и KEEP= к входному набору данныхВлияют насодержимое PDVPDVОператорыDROP и KEEPПрименение параметров DROP=и KEEP= к выходному набору данныхВыходной набор данных SASВыбор наблюдений по условию26 data employees;27set employee_list;28where age <= 65 and29 run;фильтрация при записи данныхupcase(gender) = "M" ;1 data test;2set ecprg1.accounts3(where=(Employee_ID between 11000 and 11999));4 run;фильтрация при чтении данныхЗамечания для входных наборов данных:• where умеет работать только с теми переменными, которые есть во входномнаборе данных.
Никакие новые переменные формально не должныпоявляться в условии.• При использовании оператора where в PDV попадают не все наблюдения, атолько те, которые удовлетворяют условию.• Если данные не индексированы (про индексы дальше), то с диска читаетсявесь входной набор данных (даже если часть выборки не удовлетворяетусловию).Выбор наблюдений по позиции• OBS = и FIRSTOBS= задают номер первого и последнего наблюденияв выборке,• например, считать 6 записей, начиная с 5, понятно почему?• Можно сделать аналогично с использованием _N_ переменной, нобудет медленнее• А также через прямой доступ к наблюдению по абсолитному номеручерез опицю POINTСортировка наборов данных (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)6Группировка оператором 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;Возможны вложенные группы!Чаще всего используется совместно с retainили массивами (об этом дальше)Сортировка!First.variable = 1 для первогонаблюдения в группе, =0 длядругих наблюдений,Last.variable =1 для последнегонаблюдения в группе, =0 длядругих наблюдений7Индексы и view• Отдельные файлы с индексом по переменным из исходногонабора данных• Основная задача –ускорение поиска при расчетеограничиваюющих условий и группировках (как в SQL)• Как и в СУБД может быть несколько индексов по одному набору,в некоторых случаях, например можно явно указывать имяиндекса:set mydata.employee (idxname=empnum);• Создание индекса:• С помощью процедуры proc datasets, а также в sql синтаксисе• Но можно и на шаге DATA:Data test1(index = (idx1 = (var1) idx2=(var2 var3)));• View (почти как в SQL)• программа (код шага DATA), которая генерирует набор данных• работа как с обычным набором, но физически он не создается• Создается с набор ключевым словом View:Data test2/View = Test2View;8Особенности шага Data – множественный оператор set• Посмотрим две программы:№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Второйшаг data9Особенности шага Data – множественный оператор setdata 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 закончен.А если разные dataset? То все тоже самое!!!! Два чтения в один общий PDV изапись.По сути каждый set – просто чтение данных из указанного набора в PDV!10Сохранение значений переменной в цикленаблюдений123456789101112131415161718• Как не переинициализировать PDV на каждом шаге, чтобы осуществлятьагрегацию?data 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;RETAIN variable-name <initial-value> …;11Оператор RETAIN — подробная информацияОператор RETAIN:• сохраняет значение переменной в PDV во время итераций шага DATA;• инициализирует сохраняемую переменную как пропущенное значениеперед первой итерацией шага DATA, если не задано начальное значениепеременной;• не влияет на переменные, прочитанные с помощью операторов SET,MERGE или UPDATE;• переменные, прочитанные изнаборов данных SAS,сохраняются автоматически;• Часто используется при групповойобработке (by) для формированияхарактеристик групп, например:12Очередь для переменной (Lag)• Шаг DATA последовательно читает наблюдения из набора данных.
Что делать,если нужно запомнить значение переменной, и использовать его наследующей итерации шага DATA?Пример: Посчитаем разницу между значениями переменной hires в текущемив прошлом году.1 data dif1;2 set ecprg1.yearly_saleshires;4 dif0=lag(hires);5 dif1=hires-lag(hires);6 dif2=dif(hires);7 run;1. Можно смотреть не на одно, а на несколько наблюдений назад (функцииlag2(..), lag3(..), …2. Каждая функция lag в программе формирует свою очередь.3.