合并指定列顺序

时间:2014-03-24 19:14:42

标签: sas

我有两个类似的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 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:1)

Joe的答案就是你想要的答案,但作为一个例子,你可以使用SQL来重新排序数据集中的列。以数据集为例:

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