水平合并三个 SAS 数据集并重命名列
Horizontally combine three SAS datasets with renaming of columns
我在 SAS Enterprise Guide 工作,想将三个独立的数据集合并为一个数据集。所有数据集都有一列,长度、数据类型和列数相同 header:
我的数据如下(三个 table,每个 1 列):
data1 data2 data3
apples apples apples
100 200 300
55 77 80
3422 32432 1234
我希望我的输出数据如下所示(一个 table,3 列)。 headers 列应更改为我选择的名称:
output_data
green_apples red_apples yellow_apples
100 200 300
55 77 80
3422 32432 1234
我已经搞砸了 SAS 合并语句和 proc_sql,但据我所知,我总是需要添加一些通用标识符(用于 BY 语句或类似的东西)。
有没有快速的方法来做我想做的事?
在此先感谢您的帮助。
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 中没有创建人工行标识符的好方法。
一个快速而肮脏的解决方案可以准确匹配您发布的内容:
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
的记录匹配来自 [=17] 的记录=] 或 data3
通过 id
.
我在 SAS Enterprise Guide 工作,想将三个独立的数据集合并为一个数据集。所有数据集都有一列,长度、数据类型和列数相同 header:
我的数据如下(三个 table,每个 1 列):
data1 data2 data3
apples apples apples
100 200 300
55 77 80
3422 32432 1234
我希望我的输出数据如下所示(一个 table,3 列)。 headers 列应更改为我选择的名称:
output_data
green_apples red_apples yellow_apples
100 200 300
55 77 80
3422 32432 1234
我已经搞砸了 SAS 合并语句和 proc_sql,但据我所知,我总是需要添加一些通用标识符(用于 BY 语句或类似的东西)。
有没有快速的方法来做我想做的事?
在此先感谢您的帮助。
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 中没有创建人工行标识符的好方法。
一个快速而肮脏的解决方案可以准确匹配您发布的内容:
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
的记录匹配来自 [=17] 的记录=] 或 data3
通过 id
.