水平组合三个SAS数据集,并重命名列
我在《SAS企业指南》中工作,希望将三个独立的数据集合并为一个数据集。所有数据集都有一个具有相同长度、数据类型和列标题的列: 我的数据如下所示(三个表,每个表1列): 我希望我的输出数据如下所示(一个表,3列)。列标题应更改为我选择的名称:水平组合三个SAS数据集,并重命名列,sas,proc-sql,Sas,Proc Sql,我在《SAS企业指南》中工作,希望将三个独立的数据集合并为一个数据集。所有数据集都有一个具有相同长度、数据类型和列标题的列: 我的数据如下所示(三个表,每个表1列): 我希望我的输出数据如下所示(一个表,3列)。列标题应更改为我选择的名称: output_data green_apples red_apples yellow_apples 100 200 300 55 77 80 3422
output_data
green_apples red_apples yellow_apples
100 200 300
55 77 80
3422 32432 1234
我对SAS merge语句和proc_sql进行了处理,但从我所看到的情况来看,我总是需要添加一些公共标识符(对于BY语句或类似的语句)
有没有一种快速的方法来做我想做的事
首先谢谢你的帮助
data want;
merge a(rename=apples=green_apples)
b(rename=apples=red_apples)
c(rename=apples=yellow_apples)
;
run;
正如您所说的那样,通过语句将数据集合并到一起。有一个选项(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;
请记住,此解决方案将受到最小数据集中观测数量的限制
但是,您似乎希望按照记录在数据集中出现的顺序来匹配这些记录?如果是这样,描述顺序的标识符字段将很有用(例如,如果数据集具有不同的观察计数)。一种方法是使用自动变量:
/*
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
,如果data1
中的记录与data2
或data3
中的记录通过id
匹配,则将其设置为1
,这是有意义的,但不允许我重命名列标题。此外,您可能需要说明这是否是一个tim这类事情,或者你想以一种可复制的、模块化的方式来做的事情。现在有更复杂的解决方案,它们更适合你需要灵活的事情,但对于一次性的情况来说是多余的。这只是一次性的事情,所以这是完美的。非常感谢!如果d1、d2或d3
是pointless,这是默认值。(一条记录如何出现在输出数据集中,而不是来自三个数据集中的一个?)set
选项是一种可能的解决方案,但是您应该明确地提到它和merge之间的主要区别——SAS将如何处理不同大小的数据集。这一点很好。if
语句和in
选项旨在显示SAS的思维方式,基于这个问题,它看起来像是OP n需要一些背景知识。另外,set
解决方案将受到第一个数据集中观察值数量的限制。我建议将其放在答案中,而不是放在评论中。事实上-你错了一件事,我误读了你的评论。观察值的数量不受第一个数据集的限制。它受最小的数据集。(因此,如果d1和d2有100个数据集,而d3有50个数据集,则会得到50个数据集。)当任何set
语句检索到一行失败时,数据步骤结束。
/*
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;