我有多个数据集。它们中的每一个都具有不同数量的属性。我想通过公共变量将它们合并。如果我使用proc SQL,那就是'union'。但是有很多变数。 实施例。
Dataset_Name Number of columns
dataset1 110
dataset2 120
dataset3 130
... ...
说他们共有100列。最终数据集包含所有dataset1,dataset2,dataset3..etc 只有常用列(在本例中为100列)。
我该怎么做?
如何获取每个数据集的列,这与最终数据集不相同。 示例:dataset1将有10列不在最终数据集中,并列出10列的名称。
感谢!!!!
答案 0 :(得分:2)
SQL中的UNION等同于SAS中的顺序SET。
data want;
set dataset1 dataset2 dataset3;
run;
现在,SAS默认包含任何数据集中的所有列。要限制所有数据集中的内容,您必须使用keep
语句。
您可以使用proc sql
以及其他方式来确定这一点。
proc sql;
select name into :commonlist separated by ' '
from dictionary.columns C, dictionary.columns D
where C.libname=D.libname
and C.memname='DATASET1'
and D.memname='DATASET2'
and C.name=D.name
;
quit;
对于两个以上的数据集,它更复杂,部分取决于你,但如果你对SQL感到满意,你可以很容易地解决这个问题。类似的构造可以创建仅数据集1变量的列表。重要的部分是into :commonlist separated by ' '
,它表示将选择结果拉入一个名为commonlist
的宏变量,按空格分隔行。 (冒号表示创建一个宏变量,而不是表。)
所以你可以运行:
data want (keep=&commonlist.) dset1(keep=&dset1list.) dset2(keep=&dset2list.);
set dataset1(in=ds1) dataset2(in=ds2) dataset3(in=ds3);
output want;
if ds1 then output dset1;
else if ds2 then output dset2;
else if ds3 then output dset3;
run;
in=xyz
表示一行来自哪个数据集。每个输出数据集都可以有一个单独的变量列表。您可能还希望将ID变量保留在其他数据集中。
我会说,通常在SAS中你不会做你在这里做的事情:这并不容易,因为它往往不是处理事情的最佳方式 - 特别是,小分割数据集。通常,您只需将这些额外变量保留在主数据集上,并且对于不在具有该变量的数据集中的任何人来说它们只是空值 - 假设根本不需要创建这个“主”数据集。