我有两个类似的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 回答
首先,您可能想要进行匹配合并:
如果a)一个数据集未按您认为的那样排序,或者b)一个数据集缺少一个或多个ID,则1到1合并会带来风险问题 . 匹配合并确保ID匹配 . 它确实需要在合并之前正确排序数据集 .
其次,您无法直接自动重新排序变量名称 . 您需要以某种方式构造一个正确排序的变量名称列表,具体取决于您想要如何排序它们 .
一种方法是构造一个列表并在RETAIN语句中使用它 . 这个语句实际上做了别的事情,但是用于重新排序变量很方便 .
这没关系,但将它从数据步骤中移出并将其放在可以编辑它的地方(如果它更容易更改)会很好,特别是如果你需要在几个地方使用它 . 处理它的一种方法是将它放在一个宏变量中:
然后你可以像这样使用它:
注意我将ID留在其中,因为在任何情况下都可能需要预先设置ID . 那将是重要的 .
现在,这可能适用于您的简短示例,但对于较大的数据集可能不切实际 . 如何从数据集中获取该订单?
好的,现在我们有一个带有我们名字的数据集,顺序正确 . 所以我们可以通过几种不同的方式将其转化为宏变量;这是一个 .
现在我们按字母顺序从数据集' contents. It'构造
&varorder
;如果您想要其他顺序,您可能希望按照自己喜欢的方式对其进行重新排序 . 您可以使用varnum
,它在内容输出上(将其添加到keep
语句),如果您想尝试按照数据集上的顺序保留它 .Joe的答案就是你想要的答案,但是除此之外你可以使用SQL来重新排序数据集中的列 . 以数据集为例: