Может кто-нибудь, пожалуйста, объясните шаг за шагом, что делают эти утверждения «by» и «if» в шаге данных SAS? - PullRequest
0 голосов
/ 07 мая 2020

Я новичок в SAS и пытаюсь понять, что происходит в приведенном ниже коде

data def;
     set abc;
      by id;
     if last.id;
run;

Я понимаю, что by используется для сортировки по столбцу id, но что такое if last.id делаешь?

Большое спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 07 мая 2020

if last.id;

- это особая форма if, отличная от других языков кодирования, обратите внимание, что здесь нет предложения THEN. Форма называется подмножеством , если . Поток управления DATA за пределами этого if происходит только тогда, когда test-expression истинно.

В вашем коде test-expression равно last.id.

last.<variable> (и соответствующие first.<variable>) - две автоматические c временные переменные, созданные для каждой BY переменной и указывающие, находится ли текущая строка на граничной строке группы; либо первая, либо последняя строка на уровне отдельных групп.

Вы можете вывести информацию о том, где находится текущее наблюдение в группе

FIRST.  LAST.   where
  1             at first in group
  0             not at first in group
          1     at last in group
          0     not at last in group
  1       0     group has >= 2 rows and currently at first in group
  0       0     group has >= 3 rows and currently in the middle part
  0       1     group has >= 2 rows and currently at last in group
  1       1     group has only 1 row

Вам необходимо понять основные предпосылки неявный l oop фундаментальный для обработки DATA/SET:

0 голосов
/ 07 мая 2020
data def;

Создайте набор данных с именем DEF (который будет храниться в библиотеке по умолчанию WORK) ;

    set abc;

получите ввод от набор данных ABC (который sas будет искать в библиотеке по умолчанию WORK) Это автоматически сгенерирует al oop по наблюдениям (1) ;

    by id;

добавить временное переменные (2) first.id и last.id, чтобы указать, является ли это первым / последним наблюдением с этим id (3) ;

    if last.id;

Все утверждения ниже, как а также неявный оператор output;, будет применяться только к последнему наблюдению каждого id. Это эквивалентно if not last.id then delete;. ;

run;

Скомпилируйте вышеуказанное и запустите ;

(1) На этапе данных SAS вы должны (почти) никогда не пишите что-то вроде

read file;
while not eof;
    do some stuf;
    read file;
end;

Это автоматизировано операторами set и merge.

(2) Временные переменные существуют в «программном векторе» (т.е. входят в область действия набора данных), но не записываются в набор выходных данных.

(3) Слово наблюдение на жаргоне SAS совпадает с строка на жаргоне базы данных. Разница с записью в том, что таблица sas, как и база данных, знает свою собственную структуру. Без этого оператор by и многие другие возможности языка не могли бы существовать.

...