0

所以我有多个连续变量,我曾经proc rank将它们分成 10 个组,即对于每个观察,现在有一个"GPA"和一个"GRP_GPA"值,Hmwrk_Hrs 和 GRP_Hmwrk_Hrs 也是如此。但是对于每个新的组列,值都在 1 - 10 之间。有没有办法改变这个值,例如,如果这些是组内的最小值和最大值,而不是 1,它将是 1.2-2.8?我知道我可以使用 proc 格式或 if then 或 case in sql 手动完成,但因为我有 40 个不同的列,这将非常耗时。

4

2 回答 2

0

从您的问题中不清楚您是想存储最小值-最大值还是只是用它们格式化排名列。我下面的解决方案对排名列进行格式化,并利用 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;
于 2012-08-24T08:28:53.710 回答
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;
于 2012-09-04T11:16:45.167 回答