Итак, у меня есть несколько непрерывных переменных, которые я использовал для ранжирования proc, чтобы разделить на 10 групп, то есть для каждого наблюдения теперь есть значение «GPA» и «GRP_GPA», то есть для Hmwrk_Hrs и GRP_Hmwrk_Hrs. Но для каждого из столбцов новой группы значения находятся в пределах от 1 до 10. Есть ли способ изменить это значение, так что вместо 1, например, это было бы 1,2-2,8, если бы это были минимальные и максимальные значения внутри группы? Я знаю, что могу сделать это вручную, используя формат proc, или если это или случай в sql, но поскольку у меня есть что-то вроде 40 разных столбцов, которые будут очень интенсивными.Есть ли способ назвать группы ранговых рангов, основанные на значениях внутри группы?
0
A
ответ
0
Из вашего вопроса неясно, хотите ли вы сохранить значения 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;
0
В дополнение к хорошему ответу Кита, вы также можете сделать следующее:
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;
Добро пожаловать в Stack Overflow! Непонятно, что вы просите. Часто задавать вопрос сложнее, чем отвечать на него. Потратьте минутку, постарайтесь забыть все, что знаете о своей проблеме, а затем прочитайте свой вопрос. Я уверен, мы сможем помочь. – BellevueBob