2.2 Создание data sets

(Обязательна к прочтению 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.

2.2.0

Этот метод используется крайней редко, поэтому мы не будем на нем сильно заострять внимание.

CSV (comma-separated values) file

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

2.2.1

Один из способов преобразовать 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.2.2

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:

2.2.3

Давайте немного остановимся на опциях 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;
2.2.4

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

2.2.5

Итак давайте все же поймем, как именно работает здесь 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;
2.2.6

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

Дополнительные материалы: