proc sort data=sas.mincome;
by F3 F4;
run;
Proc sort不按格式化值排序数据集,仅按内部值排序。我需要在合并之前按两个变量排序。无论如何都要用proc sort来做这个吗?
答案 0 :(得分:4)
我认为您不能按proc排序中的格式化值排序,但您绝对可以使用简单的proc SQL过程按格式化的值对数据集进行排序。 proc SQL类似于数据步骤和proc排序,但功能更强大。
用于按格式化值排序的proc sql的一般语法是:
proc sql;
create table NewDataSet as
select variable(s)
from OriginalDataSet
order by put(variable1, format1.), put(variable2, format2.);
quit;
例如,我们有一个包含某些人的姓名,性别和年龄的样本数据集,我们想对它们进行排序:
proc format;
value gender 1='Male'
2='Female';
value age 10-15='Young'
16-24='Old';
run;
data work.original;
input name $ sex age;
datalines;
John 1 12
Zack 1 15
Mary 2 18
Peter 1 11
Angela 2 24
Jack 1 16
Lucy 2 17
Sharon 2 12
Isaac 1 22
;
run;
proc sql;
create table work.new as
select name, sex format=gender., age format=age.
from work.original
order by put(sex, gender.), put(age, age.);
quit;
work.new的输出将是:
Obs name sex age
1 Mary Female Old
2 Angela Female Old
3 Lucy Female Old
4 Sharon Female Young
5 Jack Male Old
6 Isaac Male Old
7 John Male Young
8 Zack Male Young
9 Peter Male Young
如果我们按性别使用proc排序,那么Males会排在第一位,因为我们用1表示男性,2表示女性,这不是我们想要的。所以,我们可以清楚地看到proc sql实际上根据格式化的值(女性优先,男性次数)对它们进行排序。
希望这有帮助。
答案 1 :(得分:2)
由于格式的性质,SAS仅使用基础值进行排序。据我所知,你不能改变它(除非你想通过PROC TRANTAB建立自己的翻译表)。
您可以做的是创建一个包含格式化值的新列。然后你可以对该列进行排序。
proc format library=work;
value $test 'z' = 'a'
'y' = 'b'
'x' = 'c';
run;
data test;
format val $test.;
informat val $1.;
input val $;
val_fmt = put(val,$test.);
datalines;
x
y
z
;
run;
proc print data=test(drop=val_fmt);
run;
proc sort data=test;
by val_fmt;
run;
proc print data=test(drop=val_fmt);
run;
可生产
Obs val
1 c
2 b
3 a
Obs val
1 a
2 b
3 c