Я уже нашел решение своей проблемы, но я хотел бы знать, что именно происходит и почему, а может быть, если есть обходной путь к следующему:
Предположим, у вас есть:
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;
Это кажется немного страннымчтобы пропустить переменные, по которым вы сортировали, и это не кажется таким гибким, вы не можете использовать список макропеременных в качестве входных данных для сортировки и по выражению в шаге данных, например ...?Если это так, то есть ли другой предпочтительный способ выполнения таких операций?Я часто вижу, как делаю эту ошибку, просто копирую вставку списка переменных сортировки ...