总体目标是根据百分比对数量变量进行分层。我想把它分成10个等级(例如10,20,...... 100百分位数),如果它落入第10个百分点,则将其重新编码为1;如果落入第20个百分位,则将其重新编码为1,等等。此方法需要适用于我插入的任何数据集,我希望此过程尽可能自动化。下面,我已经产生了一些测试数据:如何使用表2中的信息重新编码表1中的变量(在SAS中)
data test (drop=i);
do i=1 to 1000;
a=round(uniform(1)*4,.01);
b=round(uniform(1)*10,.01);
c=round(uniform(1)*7.5,.01);
output;
end;
stop;
run;
下面的宏用于创建值的表,告诉你切断每个变量的10个百分位数。我在代码下面添加了示例输出的图片。
/*Recode variables based on quartiles from boxplot*/
%macro percentiles(var);
/* Count the number of values in the strinrecode */
%let count=%sysfunc(countw(&var));
/* Loop throurecodeh the total number of values */
%do i = 1 %to &count;
%let variables=%qscan(&var,&i,%str(,));
proc univariate data=test noprint;
var &variables;
output out=pcts pctlpts = 10 20 30 40 50 60 70 80 90 100
pctlpre = &variables;
run;
proc transpose data=pcts out=&variables (rename=(col1=&variables) drop=_NAME_ _LABEL_);
run;
%end;
data percentiles (drop=i);
do i=1 to 10;
recode=i;
percentile=i*10;
output;
end;
stop;
run;
data pcts;
merge percentiles %sysfunc(tranwrd(&var.,%str(,),%str()));
run;
%mend;
%percentiles(%str(a,b,c));
下面的代码是如何我目前正在重新编写我的变量。我使用上面宏中生成的表格来填充每个变量的每个百分点的截止点。正如你所看到的,如果我有大量的重新编码变量,这是非常单调乏味的,并且会变得过分。有没有更好的过程,或者最好的方法是我可以自动化这部分?
data test;
set test;
if a <= .415 then recode_a = 1; else if a <= .785 then recode_a = 2; else if a <= 1.255 then recode_a = 3;
else if a <= 1.61 then recode_a = 4; else if a <= 2.03 then recode_a = 5; else if a <= 2.42 then recode_a = 6;
else if a <= 2.76 then recode_a = 7; else if a <= 3.18 then recode_a = 8; else if a <= 3.64 then recode_a = 9;
else if a <= 3.99 then recode_a = 10;
if b <= .845 then recode_b = 1; else if b <= 1.88 then recode_b = 2; else if b <= 2.86 then recode_b = 3;
else if b <= 4.005 then recode_b = 4; else if b <= 5.03 then recode_b = 5; else if b <= 6.07 then recode_b = 6;
else if b <= 6.995 then recode_b = 7; else if b <= 8.035 then recode_b = 8; else if b <= 9.16 then recode_b = 9;
else if b <= 10 then recode_b = 10;
if c <= .86 then recode_c = 1; else if c <= 1.58 then recode_c = 2; else if c <= 2.34 then recode_c = 3;
else if c <= 3.15 then recode_c = 4; else if c <= 3.85 then recode_c = 5; else if c <= 4.615 then recode_c = 6;
else if c <= 5.315 then recode_c = 7; else if c <= 5.96 then recode_c = 8; else if c <= 6.75 then recode_c = 9;
else if c <= 7.5 then recode_c = 10;
run;
proc print data=test (obs=5);
run;
该死的......我只希望我早点看到你的帖子,这会为我节省很多时间和精力。我从别人的答案中学到了很多有用的东西,但这正是我所期待的。它整洁,简短,简单。非常感谢你! – NicChik
如果我想创建一个宏,并且这是我的值被输入的方式: '%percentiles(var = abc);' 我怎样才能使得生成的新变量被称为“recode_ [无论输入是什么]“而不必将它们输入排名声明中? – NicChik
是的,我建议查询SASHELP表来生成名称列表,类似于@foxer解决方案。在某些方面,重新命名或重新合并到主数据集可能更容易。如果您不使用RANK语句,它将使用相同的变量名称生成等级。 – Reeza