我有两个类似的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的初学者,只使用了几天,所以我很抱歉这是一个非常简单的问题而我在搜索时错过了答案。
答案 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;