2016-03-16 5 views
1

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

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

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

Или с помощью резюме Proc

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

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

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

ответ

2

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

 
data want ; 
    set have end=eof ; 
    retain minval minobs maxval maxobs ; 

    if value < minval or missing(minval) then do ; 
    minval = value ; 
    minobs = _n_ ; 
    end ; 

    if value > maxval or missing(maxval) then do ; 
    maxval = value ; 
    maxobs = _n_ ; 
    end ; 

    if eof then output ; 
run ; 
0

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

data _null_; 

set have; 

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

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

+0

Я надеялся сделать это за один шаг, но это именно то, к чему я стремлюсь. Однако это не работает. Я не получаю никаких ошибок при запуске вашего кода, но когда я пытаюсь вызвать '% put & obsnr', я получаю' WARNING: Очевидная символическая ссылка OBSNR не разрешена. 'И действительно, моя minvariable, скорее всего, не уникальна. –

+0

Код работал для меня с некоторыми тестовыми значениями. Вы уверены, что переменные = & minvariable совпадают в вашем случае? В противном случае obsnr никогда не будет создан. Я думаю, что есть решение решить это за один шаг, но у меня нет спонтанной идеи прямо сейчас. Если minvariable не уникален, вы должны хранить каждое соответствие в другой переменной (nobs1, nobs2, ...) – kl78

+0

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