2012-07-18 5 views
0

, если вы используете резюме процесса с классом-клаузером, он сортирует ваши наблюдения в порядке от класс -clause.SAS: proc Сводка и proc Сортировка

proc summary data=One; 
    by var_1; 
    class var_2 var_3 var_4; 
    output out = Two(drop= _freq_ _type_); 
run; 

1) Я в порядке?

2) что произойдет, если я не укажу все поля?

proc summary data = Three(keep= var_1 var_2 var_ 3 var_4 var_5 var_6); 
    by var_1; 
    class var_2 var_3; 
    output out = Four(drop= _freq_ _type_); 
run; 

3), который прок быстрее: proc summary или proc sort?

ответ

5

Несколько вещей, чтобы отметить здесь.

  • Чтобы сохранить такое же количество строк, вам нужно указать опцию nway в сводном операторе proc. Без него вы получите каждую комбинацию переменных класса 1, 2 и 3.
  • Я не уверен, почему у вас есть оператор BY (это, очевидно, указывает, что данные уже отсортированы по этой переменной). Вы также можете легко включить var_1 в инструкцию CLASS.
  • Proc Summary сначала сортирует результат в порядке переменных BY, а затем переменные CLASS в том порядке, в котором они указаны.
  • Эта логика применяется независимо от того, какие переменные сохраняются.
  • Proc Sort должен работать быстрее в этом простом экземпляре, поскольку Proc Summary будет выполнять дальнейшие вычисления, которые не требуются.
  • Я иногда использую сводку Proc для сортировки и дедуплирования данных за один шаг (с использованием функции максимизации), например. где у меня есть несколько ID в день, и я хочу только взять последний. Это экономит необходимость сортировать данные, а затем извлекать последнюю запись за день на каждый идентификатор.

Надеюсь, это поможет.

Вот пример моего последнего пункта. Использование _all_ просит вернуть все переменные в наборе данных, это создает предупреждение в журнале для переменных, ранее перечисленных в инструкции CLASS, но его можно безопасно игнорировать. В основном я ленив, не желая указывать оставшиеся переменные отдельно для широких наборов данных.

data have; 
input unique_id custno log_dt :datetime15.; 
format log_dt datetime15.; 
cards; 
1 123 01jul2012:13:23 
2 265 01jul2012:13:56 
3 342 01jul2012:15:02 
4 123 01jul2012:17:12 
5 342 01jul2012:18:33 
6 265 02jul2012:08:41 
7 123 02jul2012:10:14 
8 265 02jul2012:11:05 
; 
run; 

proc summary data=have nway; 
class custno log_dt; 
format log_dt dtdate9.; 
output out=want (drop=_:) maxid(log_dt(_all_))=; 
run; 
+0

можете ли вы добавить несколько примеров, пожалуйста? – gaussblurinc

+0

Согласен с превышением 2 баллов. 1. Чтобы сохранить одинаковое количество строк, вам нужно указать опцию nway в сводном операторе proc. Без него вы получите каждую комбинацию переменных класса 1, 2 и 3. 2. Переменная класса автоматически сортирует данные с указанной переменной. 3. Если вычисления необходимы, то резюме резюме является лучшей процедурой для использования, потому что это позволит сохранить время сортировки после этого (если данные огромны). –