我正在使用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语句或类似的东西)。
有没有快速的方法来做我想要的事情?
在前面感谢您的帮助。
答案 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
的记录匹配,则会将其设置为data2
或data3
id
。