如何按格式化值排序

时间:2013-11-17 20:30:16

标签: sas

proc sort data=sas.mincome;
    by F3 F4;
run;

Proc sort不按格式化值排序数据集,仅按内部值排序。我需要在合并之前按两个变量排序。无论如何都要用proc sort来做这个吗?

2 个答案:

答案 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