首页 文章

合并指定列顺序

提问于
浏览
1

我有两个类似的SAS数据集:

DATAONE            DATATWO  
-----------        ------------------  
ID  A  C  E        ID  B  D  F  
1   x  x  x        1   x  x  x     
2   x  x  x        2   x  x  x    
3   x  x  x        3   x  x  x

它们的行长度相等,并且每列中的ID具有相同的排序值 . 最初,要将我使用的数据与以下简单的一对一合并语句组合在一起:

data COMBINED;
    merge DATAONE DATATWO;
run;

这会产生如下输出:

COMBINED           
--------------------      
ID  A  C  E  B  D  F  
1   x  x  x  x  x  x 
2   x  x  x  x  x  x
3   x  x  x  x  x  x

这包含我想要的所有数据,但列的顺序错误 . 我的理想输出会重新组织这样的列:

COMBINEDTWO           
--------------------      
ID  A  B  C  D  E  F  
1   x  x  x  x  x  x 
2   x  x  x  x  x  x
3   x  x  x  x  x  x

但是,我不确定如何重新组织这样的列 . 检查SAS网站有一个称为匹配合并的东西,但似乎只是用于正确合并行(如果缺少行或某些东西) . 任何帮助指出我正确的方向将不胜感激 .

注意:我几乎是SAS的初学者,只使用了几天,所以我很抱歉这是一个非常简单的问题而我在搜索时错过了答案 .

2 回答

  • 2

    首先,您可能想要进行匹配合并:

    data COMBINED;
        merge DATAONE DATATWO;
        by id;
    run;
    

    如果a)一个数据集未按您认为的那样排序,或者b)一个数据集缺少一个或多个ID,则1到1合并会带来风险问题 . 匹配合并确保ID匹配 . 它确实需要在合并之前正确排序数据集 .

    其次,您无法直接自动重新排序变量名称 . 您需要以某种方式构造一个正确排序的变量名称列表,具体取决于您想要如何排序它们 .

    一种方法是构造一个列表并在RETAIN语句中使用它 . 这个语句实际上做了别的事情,但是用于重新排序变量很方便 .

    data COMBINED;
        retain ID A B C D E F;
        merge DATAONE DATATWO;
        by id;
    run;
    

    这没关系,但将它从数据步骤中移出并将其放在可以编辑它的地方(如果它更容易更改)会很好,特别是如果你需要在几个地方使用它 . 处理它的一种方法是将它放在一个宏变量中:

    %let varorder = A B C D E F;
    

    然后你可以像这样使用它:

    data COMBINED;
        retain ID &varorder.;
        merge DATAONE DATATWO;
        by id;
    run;
    

    注意我将ID留在其中,因为在任何情况下都可能需要预先设置ID . 那将是重要的 .

    现在,这可能适用于您的简短示例,但对于较大的数据集可能不切实际 . 如何从数据集中获取该订单?

    proc contents data=dataone out=var_dataone(keep=name);
    run;
    proc contents data=datatwo out=var_datatwo(keep=name);
    run;
    
    data vars;
    set var_dataone var_datatwo;
    by name;
    if name='ID' then delete;
    run;
    

    好的,现在我们有一个带有我们名字的数据集,顺序正确 . 所以我们可以通过几种不同的方式将其转化为宏变量;这是一个 .

    proc sql;
     select name into :varorder separated by ' ' 
       from vars
       order by name;
    quit;
    

    现在我们按字母顺序从数据集' contents. It'构造 &varorder ;如果您想要其他顺序,您可能希望按照自己喜欢的方式对其进行重新排序 . 您可以使用 varnum ,它在内容输出上(将其添加到 keep 语句),如果您想尝试按照数据集上的顺序保留它 .

  • 1

    Joe的答案就是你想要的答案,但是除此之外你可以使用SQL来重新排序数据集中的列 . 以数据集为例:

    proc sql;
     create table COMBINED_REORDER as
     select ID, A, B, C, D, E, F 
     from COMBINED
    quit;
    

相关问题