2015-07-04 3 views
1

Хорошо, это похоже на очень простую вещь, но я не могу объяснить, что на самом деле делает «by statement» в sas datastep. Я знаю, когда мне нужно его использовать, но я не уверен, что он делает.Что такое инструкция, выполняемая на шаге sas data?

В приведенном ниже примере я понимаю, что представляет собой виртуальный столбец sas first.var и last.var, когда он имеет значения, которые он выполняет. Является ли оператор by, создающий эти виртуальные столбцы вокруг начального и металлического var? Затем sas сканирует весь набор данных один раз?

data jewelers ; 
    input id initial $ metal $ ; 
datalines; 
456 D Gold 
456 D Silver 
123 L Gold 
123 L Copper 
123 L PLatinum 
567 R Gold 
567 R Gold 
567 R Gold 
345 A Platinum 
345 A Silver 
345 A Silver 
; 

proc sort ; 
    by initial metal ; 
run; 

data dups; 
    set jewelers ; 
    by initial metal ;       
    if not (first.metal and last.metal) then output; 
run; 

если я Proc печати Dups Я ожидаю, что это:

567 R Gold 
567 R Gold 
567 R Gold 
345 A Silver 
345 A Silver 
+0

в вашем примере 'first.id' и' last.id' неинициализированы, так как они не отображаются в '' '' '. Чтобы увидеть, какие скрытые переменные созданы, добавьте инструкцию 'put _all_;' после вашего оператора 'by'. (Делайте это только для небольших наборов данных, поскольку он может заполнить журнал). – mjsqu

ответ

2

Как вы признали, SAS создает автоматические переменные first.byvar и last.byvar для каждого byvar в вашем by заявлении. Записи, считанные из инструкции set, хранятся в буфере до того, как SAS переместит их в PDV (вектор данных программы - где логика шага данных выполняется в каждой строке перед ее выходом), поэтому SAS может смотреть вперед на следующую запись в буфера, чтобы увидеть, изменился ли какой-либо из байров, и установите last.byvar = 1 для строки, находящейся в настоящее время в PDV.

Единственная разница, которую я могу видеть между тем, что вы говорите, чего вы ожидаете, и тем, что вы получаете в наборе данных дубликатов, - это порядок записей - поскольку вы отсортированы по начальному, а затем по металлу, записи A Silver сортируются перед R Gold записей.

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

0

SAS в основном сравнивает текущую запись с предыдущей и следующей после вычисления FIRST. и ПОСЛЕДНИЕ. флаги. Вы можете бросить свой собственный, если хотите.

data test ; 
    set jewelers end=eof; 
    by initial metal ; 
    if not eof then 
     set jewelers (firstobs=2 keep=initial metal 
        rename=(initial=next_initial metal=next_metal)) 
    ; 
    first_initial = (_n_=1) or (initial ne lag(initial)); 
    last_initial = eof or (initial ne next_initial) ; 
    first_metal = first_initial or (metal ne lag(metal)) ; 
    last_metal = last_initial or (metal ne next_metal); 
    put/(initial metal) (=); 
    put (first:) (=); 
    put (last:) (=); 
run; 

 Смежные вопросы

  • Нет связанных вопросов^_^