sas: как настроить оператор if-then для нескольких переменных - PullRequest
0 голосов
/ 02 октября 2018

Скажем, у меня есть набор данных, который состоит из schoolID SAT_code и student_name.Что я хочу классифицировать, так это то, что для schoolID с 'ABC' было бы то же самое SAT_code из 'East'.В то время как те, у кого schoolID с 'XYZ', будут иметь те же SAT_code из 'Midwest'.

Для такого набора данных:

schoolID    SAT_code    student_name
ABC                     Jasmine Smith
ABC                     Michael Jordan
ABC                     Madison Trump
XYZ                     Sarah Potter
XYZ                     Jim Fowler
XYZ                     Jack Black
 .                          .
 .                          .
 .                          .

Кроме этого, существует более 30 schoolID.

Самым простым, но пресловутым из всех, что я мог придумать, было использование if-then 30 раз.

data stateSAT;
 set statestats;
 if schoolID eq 'ABC' then SAT_code 'East';
 else if schoolID eq 'XYZ' then SAT_code 'Midwest';
 else if schoolID eq 'MNO' then SAT_code 'East';
         and so forth.....
 run;

Есть ли более эффективный способ, возможно, с использованием некоторого цикла for длярешить эту проблему?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Ваша длинная последовательность операторов if/then может быть более четко сформулирована с помощью оператора SELECT.Он аналогичен SQL CASE или C switch

length SAT_code $20;

select (schoolID);
  when ("ABC") SAT_code = 'East';
  when ("XYZ") SAT_code = 'Midwest';
  when ("MNO") SAT_code = 'East';
  …
  otherwise SAT_code = '???';
end;

Однако при наличии 30+ идентификаторов школ вы бы лучше следовали советам @mjsqu по переносу этих сопоставлений schoolID в другую структуру данных.

0 голосов
/ 02 октября 2018

Таблица поиска

Лучше всего это сделать с помощью таблицы поиска:

Создать таблицу с schoolID и SAT_code, а затем выполнить объединение с исходной таблицей:

data schoolsat;
  infile datalines delimiter=',';
  input schoolID $3 SAT_code $25;
  datalines;
ABC,East
XYZ,Midwest
MNO,East
;
run;

Это создает таблицу, которая отображает значения schoolID на значения SAT_code.Добавьте все необходимые комбинации в эту таблицу.

Как только вы это сделаете, в мире SAS есть два способа объединения данных.Оба эти примера являются «левыми соединениями», в которых будут храниться все записи из вашей таблицы statestats, независимо от того, есть ли соответствующая строка в вашей новой таблице отображения schoolsat, созданной выше.Если в schoolsat нет соответствующего значения schoolID, SAS оставит отсутствующее значение для SAT_code в результирующей таблице.

SQL

proc sql;
  create table stateSAT as
  select a.*,
  b.SAT_code
  from statestats a
  left join schoolsat b
  on a.schoolID = b.schoolID;
quit;

DATA Шаг

proc sort data=schoolsat;
  by schoolID;
run;

proc sort data=statestats;
  by schoolID;
run;

data stateSAT;
  merge statestats (in=a)
        schoolsat;
  by schoolID;
  if a;
run;
...