Лекция 2. Программирование на языке SAS. Основы шага DATA (1185374)
Текст из файла
Программирование на языке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.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.