Есть ли способ называть группы ранга процессов на основе значений внутри группы?

Итак, у меня есть несколько непрерывных переменных, которые я использовал proc rank для разделения на 10 групп, т.е. для каждого наблюдения теперь есть значения "GPA" и "GRP_GPA", то же самое для Hmwrk_Hrs и GRP_Hmwrk_Hrs. Но для каждого из столбцов новой группы значения находятся в диапазоне от 1 до 10. Есть ли способ изменить это значение так, чтобы вместо 1, например, было бы 1,2-2,8, если бы это были минимальные и максимальные значения в группе? Я знаю, что могу сделать это вручную, используя формат proc или if then или case в sql, но поскольку у меня есть что-то вроде 40 разных столбцов, это займет очень много времени.


person jswtraveler    schedule 23.08.2012    source источник
comment
Добро пожаловать в Stack Overflow! Непонятно, о чем вы спрашиваете. Часто задать вопрос труднее, чем ответить на него. Найдите минутку, постарайтесь забыть все, что вы знаете о своей проблеме, а затем прочтите свой вопрос. Я уверен, что мы сможем помочь.   -  person BellevueBob    schedule 24.08.2012


Ответы (2)


Из вашего вопроса неясно, хотите ли вы сохранить значения min-max или просто отформатировать столбцы ранга с ними. Мое решение ниже форматирует столбец ранга и использует способность SAS создавать форматы из набора данных. Я, очевидно, использовал только 1 переменную для ранжирования, для ваших данных будет несложно обернуть макрос вокруг кода и запустить для каждой из ваших 40 или около того переменных. Надеюсь это поможет.

/* create ranked dataset */
proc rank data=sashelp.steel groups=10 out=want;
var steel;
ranks steel_rank;
run;

/* calculate minimum and maximum values per rank */
proc summary data=want nway;
class steel_rank;
var steel;
output out=want_min_max (drop=_:) min= max= / autoname;
run;

/* create dataset with formatted values */
data steel_rank_fmt;
set want_min_max (rename=(steel_rank=start));
retain fmtname 'stl_fmt' type 'N';
label=catx('-',steel_min,steel_max);
run;

/* create format from previous dataset */
proc format cntlin=steel_rank_fmt;
run;

/* apply formatted value to rank column */
proc datasets lib=work nodetails nolist;
modify want;
format steel_rank stl_fmt10.;
quit;
person Longfish    schedule 24.08.2012

В дополнение к хорошему ответу Кита вы также можете сделать следующее:

proc rank data = sashelp.cars groups = 10 out = test;
var enginesize;
ranks es;
run;

proc sql ;
 select *, catx('-',min(enginesize), max(enginesize)) as esrange, es from test
 group by es
 order by make, model
;
quit;
person RosaryGuy    schedule 04.09.2012