如何在SAS中通过公共变量合并多个数据集?

时间:2014-08-20 14:22:20

标签: sas

我有多个数据集。它们中的每一个都具有不同数量的属性。我想通过公共变量将它们合并。如果我使用proc SQL,那就是'union'。但是有很多变数。 实施例。

Dataset_Name    Number of columns   
dataset1           110
dataset2           120
dataset3           130
...                ...

说他们共有100列。最终数据集包含所有dataset1,dataset2,dataset3..etc 只有常用列(在本例中为100列)。

我该怎么做?

如何获取每个数据集的列,这与最终数据集不相同。 示例:dataset1将有10列不在最终数据集中,并列出10列的名称。

感谢!!!!

1 个答案:

答案 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中你不会做你在这里做的事情:这并不容易,因为它往往不是处理事情的最佳方式 - 特别是,小分割数据集。通常,您只需将这些额外变量保留在主数据集上,并且对于不在具有该变量的数据集中的任何人来说它们只是空值 - 假设根本不需要创建这个“主”数据集。