首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按原始顺序排序

按原始顺序排序
EN

Stack Overflow用户
提问于 2014-09-25 22:34:57
回答 2查看 730关注 0票数 1

假设你有三个独立的数据集,由相同数量的观测组成。每个观察都有一个ID字母an,后面跟着一些数值观察。例如:

数据集1:

代码语言:javascript
复制
B   3   8   1   9   4
C   4   1   9   3   1
A   4   4   5   4   9

数据集2:

代码语言:javascript
复制
C   3   1   9   4   0
A   4   1   2   0   0
B   0   3   3   1   8

我想通过第一个变量合并数据集。问题是,第一个变量还没有按字母排序,我不想按字母排序。我想要合并数据,但要保持原来的顺序。例如,我会得到:

合并数据:

代码语言:javascript
复制
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

有办法这样做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-26 03:05:02

您可以创建一个保存顺序的变量,然后在其“合并”后应用新的数据集。我相信这是一个附加,而不是合并。我使用了一种格式,不过您也可以使用sql或数据集合并。

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2014-10-02 10:11:59

这只是一个SQL版本,它遵循与Joe的答案类似的路径。行顺序是通过子查询而不是格式输入的。但是,两个输入表的初始顺序在行顺序子查询的联接中丢失。通过使用表名作为次要顺序变量(have2跟随have1)重新安装原始顺序。

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26049249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档