2014-03-24 81 views
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

首先,你可能想要做一个匹配合并:

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

1对1的合并风险问题如果)一个数据集是没有排序,你认为它应该是的方式,或b)一个数据集缺少一个或多个ID。匹配合并确保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出来,因为这可能需要被在任何情况下都可以。这在以后很重要。

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

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语句中)。

+0

这解决了我的问题,并提供了大量的其他有用的信息超出了我的问题的原始范围。非常感谢! –

+1

没问题。请注意,如果数据步骤中的变量在合并或设置语句中不被引入,那么'retain'确实会影响变量在数据步骤中的操作方式,即如果在该合并语句期间创建新变量;如果它在'retain'语句中,它的行为与普通的新变量略有不同(具体来说,如果没有其他设置,它将保持行到行的值)。 – Joe

1

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

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