SAS按原始顺序排序

时间:2014-09-25 22:34:57

标签: sas

假设您有三个由相同数量的观察组成的独立数据集。每个观察都有一个ID字母,A-Z,然后进行一些数字观察。例如:

数据集1:

B   3   8   1   9   4
C   4   1   9   3   1
A   4   4   5   4   9

数据集2:

C   3   1   9   4   0
A   4   1   2   0   0
B   0   3   3   1   8

我想合并第一个变量的数据集BY。问题是,第一个变量尚未按字母顺序排序,我不想按字母顺序排序。我想合并数据但保留原始订单。例如,我会得到:

合并数据:

B   3   8   1   9   4
B   0   3   3   1   8
C   4   1   9   3   1
C   3   1   9   4   0
A   4   4   5   4   9
A   4   1   2   0   0

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以创建一个包含订单的变量,然后将新数据集应用于" merged"之后。我相信这是一个附加而不是合并。我已经使用了一种格式,但你也可以使用sql或数据集合并。

data have1;
input id $ var1-var5;
cards;
B   3   8   1   9   4
C   4   1   9   3   1
A   4   4   5   4   9
;
run;


data have2;
input id $ var1-var5;
cards;
C   3   1   9   4   0
A   4   1   2   0   0
B   0   3   3   1   8
;
run;

data order;
set have1;
fmtname='sort_order';
type='J';
label=_n_;
start=id;
keep id fmtname type label start;
run;

proc format cntlin=order;
run;


data want;
set have1 have2;
order_var=input(id, $sort_order.);
run;

proc sort data=want;
by order_var;
run;

答案 1 :(得分:0)

这只是一个SQL版本,它遵循与Joe的答案类似的路径。行顺序通过子查询而不是格式输入。但是,在行顺序子查询的连接中,两个输入表的初始顺序将丢失。通过使用表名作为二级顺序变量来重新设置原始顺序(has2跟随has1)。

proc sql;
    create table want1 as
    select want.id
        ,want.var1
        ,want.var2
        ,want.var3
        ,want.var4
        ,want.var5

    from    (   
            select  *
                , 'have1' as source
            from    have1
            union   all
            select  *
                , 'have2' as source
            from    have2
        )   as  want

    left    join
        (   
            select  id
                , monotonic() as row_no
            from    have1
        )   as  order
    on  want.id eq  order.id

    order by order.row_no
        ,want.source
    ;
quit;

proc compare 
    base=want1
    compare=want
    ;
run;

这是没有格式的数据步骤版本。这里,带有行顺序的has1表与连接数据(has1和have2)重新合并,然后按行顺序重新排序。

data want2;
    set have1 have2;
run;


data have1;
    set have1;
    order_var = _n_;
run;

proc sort   data=want2;
    by id;
run;


proc sort   data=have1;
    by id;
run;

data want2;
    merge want2 have1;
    by id;
run;


proc sort data=want2;
by order_var;
run;


proc compare 
    base=want2
    compare=want
    ;
run;