水平组合三个SAS数据集并重命名列

时间:2017-02-28 18:55:07

标签: sas proc-sql

我正在使用SAS Enterprise指南,并希望将三个独立的数据集合并到一个数据集中。所有数据集都有一列具有相同的长度,数据类型和列标题:

我的数据如下(三个表,每个1列):

data1         data2        data3

apples        apples       apples
100           200          300
55            77           80
3422          32432        1234 

我希望我的输出数据看起来如下(一个表,3列)。列标题应更改为我选择的名称:

output_data

green_apples  red_apples   yellow_apples
100           200          300
55            77           80
3422          32432        1234 

我已经搞乱了SAS合并语句和proc_sql,但是从我看到的我总是需要添加一些公共标识符(对于BY语句或类似的东西)。

有没有快速的方法来做我想要的事情?

在前面感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

data want;
  merge a(rename=apples=green_apples) 
        b(rename=apples=red_apples) 
        c(rename=apples=yellow_apples)
  ;
run;

那就像你说的那样,将数据集合并到没有by语句。有一个选项(options mergenoby=ERROR|WARN|NOWARN)可能会使此语句出错或产生警告(因为这通常是错误的),但您可以将其转换为NOWARN以避免这种情况。

在没有创建人工行标识符的情况下,没有一种好方法可以在SQL中执行此操作。

答案 1 :(得分:0)

一个快速而肮脏的解决方案,可以完全匹配您发布的内容:

data output_data;
    set data1 (rename=(apples = green_apples));
    set data2 (rename=(apples = red_apples));
    set data3 (rename=(apples = yellow_apples));
run;

请注意,此解决方案会受到最小数据集中观察次数的限制。

但是,您似乎希望通过它们出现在数据集中的订单匹配记录?如果是这样,描述顺序的标识符字段将是有帮助的(例如,如果数据集具有不同的观察计数)。一种方法是使用_N_自动变量:

/*
    Changing observation counts
*/
data data1;
    id = _N_;
    input apples 8.;
    cards;
100
55
3422
;
run;

data data2;
    id = _N_;
    input apples 8.;
    cards;
200
77
32432
1
2
;
run;

data data3;
    id = _N_;
    input apples 8.;
    cards;
300
80
1234 
5
;
run;

data output_data;
    merge data1 (in=d1 rename=(apples = green_apples))
          data2 (in=d2 rename=(apples = red_apples))
          data3 (in=d3 rename=(apples = yellow_apples));
    by id;
    if d1 or d2 or d3;
run;

此处,数据集选项(in=d1...会创建一个临时变量d1,如果来自1的记录与来自data1的记录匹配,则会将其设置为data2data3 id