2012-08-23 5 views
0

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

+3

Добро пожаловать в Stack Overflow! Непонятно, что вы просите. Часто задавать вопрос сложнее, чем отвечать на него. Потратьте минутку, постарайтесь забыть все, что знаете о своей проблеме, а затем прочитайте свой вопрос. Я уверен, мы сможем помочь. – BellevueBob

ответ

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;