2016-01-21 3 views
0

В настоящее время я собираю данные в SAS EG 6.1, чтобы получить значения min и max на основе наблюдения. Теперь мне нужно, чтобы быть в состоянии захватить минимальное значение из массива, где включены только в массиве число> = 90.Минимальное значение массива с максимальными критериями

data MinMaxRows; 
set tbl4; 
where EvalDt1 <> .; 
array x(3) date1-date3; 
max_value=max(of x(*)); 
min_value=min(of x(*)); 
run; 

ответ

1

Там всегда «ручной» способ .. .ie через массив.

data want; 
set tbl4; 
array crit(3) crit1-crit3; 
array date(3) date1-date3; 

crit_max90=.; 
crit_index90=.; 
do i=1 to dim(crit); 
if crit(i)>90 and crit(i)>crit_max90 then do; 
    crit_max90=crit(i); 
    crit_index90=i; 
end; 
end; 

run; 
2

Похоже, вам нужно создать еще один массив с вашими критериями 90, что соответствует Дата. Это то, что я представляя данные глядя, как:

data &wl.tbl4; 
infile datalines; 
input @1 date1 mmddyy10. 
     @10 date2 mmddyy10. 
     @19 date3 mmddyy10. 
     @28 Evaldt1 mmddyy10. 
     @37 crit1 
     @40 crit2 
     @43 crit3; 
format date1--evaldt1 mmddyy10.; 
datalines; 
1/1/2016 1/2/2016 1/3/2016 1/1/2016 85 90 95 
; 
run; 

И это то, что вы будете использовать, чтобы применить эти критерии в массив:

data MinMaxRows; 
set tbl4; 
where EvalDt1 <> .; 
array x(3) date1-date3; 
array x_90(3) _temporary_; 
array crit(3) crit1-crit3; 
do i = 1 to 3; 
    if crit(i) >= 90 then x_90(i) = x(i); 
end; 
format max_value min_value max_value_90 min_value_90 mmddyy10.; 
max_value=max(of x(*)); 
min_value=min(of x(*)); 
max_value_90=max(of x_90(*)); 
min_value_90=min(of x_90(*)); 
run; 
0

Отбросьте любые значения меньше 90, а затем выполнить min() и max():

 
data want ; 
    set have ; 
    array dt{*} date1-date3 ; 
    do i = 1 to dim(dt) ; 
    dt{i} = ifn(dt{i} < 90 , . , dt{i}) ; 
    end ; 
    dtmax = max(of dt:) ; 
    dtmin = min(of dt:) ; 
run ; 
+0

Кажется довольно разрушительным, не так ли? – Joe

1

Если вы хотите сделать это с помощью одной функции, вы всегда можете использовать FCMP (в 9.4+, я думаю, 9.3 он не примет временную решетку):

proc fcmp outlib=work.funcs.func; 
    function minMin(min,num[*]); 
    curMin = constant('BIG'); 
    do _i = 1 to dim(num); 
     if num[_i] ge min and num[_i] lt curMin then 
     curMin = num[_i]; 
    end; 

    if curMin < constant('BIG') then 
     return(curMin); 
    else return(.); 

    endsub; 
quit; 
options cmplib=work.funcs; 

data test; 
    array x[3]; 
    x[1]=4; 
    x[2]=11; 
    x[3]=15; 
    x_min=min(of x[*]); 
    x_min_10 = minMin(10,x); 
    put x_min= x_min_10=; 
run; 
Смежные вопросы