(Обязательна к прочтению chapters 3.4, 3.5, 3.6, 4.7, 4.10. Желательны chapters 3.2, 3.7, 3.8, 3.13 )
Создание data set из другого data set
Этот метод, пожалуй, самый простой и используется чаще остальных.
data subj_info; set student.test; race=”WHITE”; run;
Итак, мы только что создали data set subj_info из data set. Но еще чаще удобнее скопировать data set в рабочую библиотеку Work с помощью proc copy.
DATALINES statement
Рассмотрим такой код
data demographic; input Gender $ Age Height Weight; datalines; M 50 68 155 F 23 60 101 M 65 72 220 F 35 65 133 M 15 71 166 ; run;
input – содержит имена переменных, которые мы создаем из данных, приведенных под datalines.

Этот метод используется крайней редко, поэтому мы не будем на нем сильно заострять внимание.
CSV (comma-separated values) file
Достаточно часто приходится создавать data set из каких-либо внешних источников, в частности из Excel файла. Предположим, у нас есть файл Lab_ranges.xls, который нам нужно зачитать и использовать.

Один из способов преобразовать xls файл в csv - сохранить его как csv в Microsoft Excel.
Открываем xls файл в Microsoft Excel, открываем вкладку Файл -> Сохранить как -> Тип файла – указываем CSV (разделители запятые) -> Сохранить.
Итак, давайте попробуем создать data set из Lab_ranges.csv двумя способами.
Для удобства давайте обозначим filename nr с помощью filename statement
filename nr " d:\SAS_learning\rawdata\ Lab_ranges.csv";
1) С помощью input statement
data Lab_ranges1; length lbtestcd lborresu Lab_Test_Parameter Gender Normal_Range $200; infile nr dsd delimiter=","; input lbtestcd$ lborresu$ Lab_Test_Parameter$ Gender$ Normal_Range$; run;
infile – keyword
dsd – опция, которая дает понять SAS, что мы хотим зачитывать данные с разделителем.
delimiter=”,” – указываем какой именно разделитель
input lbtestcd $ … – перечисляем по очереди названия переменных, в которые будут сохранены наши данные
length lbtestcd … $200 – мы добавили с той целью, чтобы данные не обрезались
В этом примере мы сообщаем SAS, что будем зачитывать файл с запятой в качестве разделителя. Иными словами, все, что находится между двумя запятыми – значение соответствующей переменной. Если SAS видит две запятые подряд без какого-либо значение между ними, он расценивает это как пустое значение.

2) С помощью proc import
proc import datafile=nr out=lab_ranges2 dbms=csv; getnames=no; guessingrows=120; delimiter=”,”; run;
proc import – keyword
datafile – указываем адрес и название файла, который мы хотим зачитать
out – указываем название data set, который будет создан из нашего файла
getnames=no – указываем, что в первой строчке нашего файла не хранятся имена и первую строку не нужно использовать как название переменных
guessingrows – тут мы указываем количество строк, которое нужно просмотреть SAS, чтобы определить длину и тип для каждой переменной
delimiter=”,” – с этой опцией мы уже знакомы из предыдущего пункта. В ней мы указываем тип разделителя в файле.
Получаем data set Lab_ranges2:

Давайте немного остановимся на опциях getnames и guessingrows. Достаточно часто приходится зачитывать файлы, в которых в первой строке хранятся названия колонок (что и логично). Указав getnames=yes, мы получим более осмысленные имена переменных, чем просто VAR1 – VARN. Относительно второй опции, guessingrows. Не подсказав SAS сколько строк просмотреть, он смотрит на какое-то количество первых строк и, наивный, полагает, что дальше будут подобные данные. Где именно таятся опасности? Например, если в строковых переменных в первых строках хранятся данные, которые имеют длину меньше, чем данные ниже. Обратите внимание на вторую колонку в нашем файле. Как мы можем видеть, в первых двух строках значения короче, чем в третьей и четвертой. Еще один пример, если в колонке могут встречаться значения и строковые и численные. Нам, естественно, хотелось бы получить строковую переменную, где цифры будут сохранены просто как текст. Однако если звезды стали так, что в первых строках у вас хранятся только цифры, а уже дальше в этой колонке можно увидеть и строковые символы, то мы рискуем раскрасить наш лог во все цвета радуги, т.е. увидеть ERROR в Log.
Использование output statement
Output statement говорит SAS «записать текущую observation в SAS data set немедленно». На данном этапе мы можем использовать output для создания небольших вспомогательных или проверочных data sets. Например,
data all_levels; length value $20; rank=1; value="MILD"; output; rank=2; value="MODERATE"; dem_var=99; output; rank=3; value="SEVERE"; output; run;

Три output statements создали нам три строки в data set all_levels. Мы создали numeric переменную rank, char переменную value и еще одну numeric переменную dem_var. Во-первых, обратите внимание, что мы задали длину для переменной value. Если этого не сделать, то уже во второй строке data set мы получим обрезанное значение для MODERATE. Во-вторых, обратите внимание на переменную dem_var. В первой строке, где мы ее не определяли, она принимает пустое значение, т.к. создаем мы ее только во втором output (который делает нам вторую строку). Однако в третьем output мы тоже не указывали dem_var, но получили не пустое значение, а 99.

Итак давайте все же поймем, как именно работает здесь output. В первом блоке
rank=1; value="MILD"; output;
мы создаем первую строку, в ней определяем две переменные.
Во втором блоке
rank=2; value="MODERATE"; dem_var=99; output;
мы хотим повторно создать предыдущую строку (т.е. первую), но меняем значения переменных rank, value и дополнительно создаем новую переменную dem_var.
В третьем блоке
rank=3; value="SEVERE"; output;
мы снова хотим повторить предыдущую строку (теперь уже вторую), но меняем значения переменных rank и value, а вот значение dem_var мы не меняем, поэтому и получаем 99 в третьей строке нашего data set.
Data _null_
или data set, которого нет. Бывают случаи, когда вам нужно проделать какие-то манипуляции в data set, например, вывести какое-нибудь предупреждение или создать макро переменную с конкретным значением из data set, однако создавать отдельный data set для этого вам не обязательно. Давайте рассмотрим пример
data _null_; put "WARNING: " "Variable LBNRIND is temporary missing"; run;

В этом случае вы не делаете ничего, кроме вывода сообщения в Log. Это бывает удобно, если вам нужно оставить себе какое-то сообщение при следующем запуске вашей программы.
Дополнительные материалы: