SAS: получить номер наблюдения для максимального / минимального значения переменной

Я пытаюсь получить в качестве макропеременной или простой переменной номер наблюдения, который является мин / макс одной переменной.

Я могу легко получить значение этого мин / макс, через процесс SQL

proc sql noprint;
select min(variable) into :minvariable
from have;
quit;

Или через сводку процедур

proc summary data=want;
var variable;
output out=mintable min=minvariable;
run;

Но я не нашел ни одного способа, чтобы легко найти число наблюдений, которому соответствует этот минимум.

Предыстория: я хочу отделить свою отсортированную базу данных на основе этого числа наблюдения, потому что я знаю, что отсортированный правильно есть глобальный минимум, и моя интересующая переменная следует U-образной кривой

2 ответа

Решение

Вы можете сделать это за один проход через данные, используя retain, Там, где одно и то же значение минимума / максимума встречается несколько раз, сохраняется наблюдение за первым увиденным.

данные хотят;
  set end = eof;
  сохранить minval minobs maxval maxobs;

  если значение  maxval или отсутствует (maxval), тогда сделайте;
    maxval = значение;
    maxobs = _n_;
  конец;

  если eof тогда вывод;
бежать;

Надеюсь, я вас правильно понял. Вы хотите знать, в какой позиции ваш minvariable находится на вашем столе? Затем вы можете просто запустить шаг данных и записать Позицию (которая является _n_ в шаге данных) в макро-переменную (или переменную данных, если вы предпочитаете), когда ваша минимальная переменная совпадает.

data _null_;

set have;

if variable =&minvariable then
call symputx("obsnr", _n_);
run;

Это работает, если ваш minvariable уникален

Другие вопросы по тегам