Несколько операторов в шаге данных? - PullRequest
0 голосов
/ 21 декабря 2018

Я уже нашел решение своей проблемы, но я хотел бы знать, что именно происходит и почему, а может быть, если есть обходной путь к следующему:

Предположим, у вас есть:

data test;
   length group $20.;
   subject=1; hours=0; group= 'hour 1'; output;
   subject=1; hours=1; group= 'hour 15'; output;
   subject=1; hours=2; group= 'hour 15'; output;
   subject=2; hours=0; group= 'hour 1'; output;
   subject=2; hours=1; group= 'hour 15'; output;
   subject=2; hours=2; group= 'hour 15'; output;
run;

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

proc sort data=test;
   by subject hours group;
run;

Теперь, когда вы запускаете этот код, чтобы получить толькоПервая запись каждой группы:

data test2;
   set test;
   by subject hours group;
   if first.group;
run;

Будет напечатана каждая запись.

Недавно я узнал, что «когда вы используете более одной переменной в выражении BY;Если первая / последняя переменная, связанная с первичной переменной BY, изменится на 1, первая / последняя переменная, связанная со второй переменной BY, также изменится на единицу. '.Поэтому, конечно, поскольку переменная часов изменяется, первый / последний из группы также сбрасывается.

Так почему же этот код работает нормально?

data test2;
   set test;
   by subject group;
   if first.group;
run;

Это кажется немного страннымчтобы пропустить переменные, по которым вы сортировали, и это не кажется таким гибким, вы не можете использовать список макропеременных в качестве входных данных для сортировки и по выражению в шаге данных, например ...?Если это так, то есть ли другой предпочтительный способ выполнения таких операций?Я часто вижу, как делаю эту ошибку, просто копирую вставку списка переменных сортировки ...

1 Ответ

0 голосов
/ 21 декабря 2018

Если вы хотите использовать оператор BY для генерации FIRST.и ПОСЛЕДНЕЕ.переменные для сгруппированной переменной, которая на самом деле не отсортирована, затем используйте ключевое слово NOTSORTED в операторе BY.

Например, вы можете упорядочить данные по ЧАСУ, а затем сгруппировать их по СТАТУСУ, чтобы вы могли выяснить, в какой час они перешли к этому СТАТУСУ.

data have;
  input subject hour status $;
cards;
 1  0   C
 1  1   B
 1  2   B
 1  3   D
 2  0   A
 2  1   D
 2  2   D
;

data want ;
  set have ;
  by subject status notsorted;
  if first.status;
run;

Результат:

Obs    subject    hour    status

 1        1         0       C
 2        1         1       B
 3        1         3       D
 4        2         0       A
 5        2         1       D
...