导出/导入SAS数据集的属性

时间:2015-07-24 04:00:19

标签: sas

我正在研究多种调查数据。我已经为第一波数据定义了格式和标签。

第二波数据将有所不同,但代码,标签,格式和变量名称都是相同的。我不想再次定义所有这些属性......似乎应该有一种方法可以导出一个数据集的PROC CONTENTS信息并将其导入另一个数据集。有没有办法做到这一点?

我发现的最接近的东西是PROC CPORT,但我对它完全感到困惑,无法让它运行。

(为了清楚我也会以另一种方式提出这个问题......)

当您运行PROC CONTENTS时,SAS会告诉您它为数据集中的每个变量使用的格式,标签等。

我有第二个数据集,其中包含完全相同的变量名称。我想使用第一个数据集中的变量属性来处理第二个数据集中的变量。有没有办法做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:1)

因此,您有一个MODEL数据集和一个HAVE数据集,两者都包含数据。您希望创建具有HAVE数据的WANT数据集,其中包含MODEL(格式,标签和变量长度)的属性。你可以这样做:

data WANT ;
  if 0 then set MODEL ;
  set HAVE ;
run ;

这是有效的,因为当DATA步骤编译时,SAS构建定义变量属性的程序数据向量(PDV)。即使SET MODEL永远不会执行(因为0不是真的),当步骤编译时,MODEL中的所有变量都会在PDV中创建。

重要的是,请注意,如果有相应的变量具有不同的长度,则MODEL的长度将决定WANT中变量的长度。因此,如果HAVE的变量比MODEL中的同名变量长,则可能会被截断。选项VARLENCHK确定如果发生这种情况,SAS是否会抛出警告/错误。

假设HAVE数据集上没有格式/标签。如果HAVE中的变量具有格式/标签,并且MODEL中的相应变量没有格式/标签,则HAVE中的格式/标签将应用于WANT。

以下示例代码。

data model;
  set sashelp.class;
  length FavoriteColor $3;
  FavoriteColor="Red";
  dob=today();
  label 
    dob='BirthDate'
  ; 
  format 
    dob mmddyy10.
  ;
run;

data have;
  set sashelp.class;
  length FavoriteColor $10;
  dob=today()-1;
  FavoriteColor="Orange";
  label
    Name="HaveLabel"
    dob="HaveLabel"
  ;
  format 
    Name $1.
    dob comma.
  ;
run;

options varlenchk=warn;

data want;
  if 0 then set model;
  set have;
run;

答案 1 :(得分:1)

我将基于现有数据集创建一个空数据集,然后使用proc append将内容附加到其中。

为第二轮数据创建一些示例数据:

data new_data;
  age = 10;
run;

根据原始数据创建一个空数据集:

proc sql noprint;
  create table want like sashelp.class;
quit;

将数据附加到空数据集中,保留原始数据的详细信息:

proc append base=want data=new_data force nowarn;
run;

请注意,我已使用force上的nowarnproc append选项。即使在使用的两个数据集之间发现差异,这也将确保附加数据。例如,如果您有格式差异,则可以预期这种情况。它还会隐藏一些内容,比如新表中存在的列是否存在于旧表中等等。所以要小心,这样做是你想做的。如果行为是不合需要的,请考虑使用datastep来代替(并首先列出want数据集)。

答案 2 :(得分:0)

欢迎来到堆栈。

如果要复制表中没有数据的属性,可以使用PROC SQL或读入零行的数据步骤。

此示例将有关SASHELP.CLASS数据集的所有信息复制到全新的数据集中。所有格式,属性,标签,整个东西都是副本。如果只想复制某些列,请在select子句而不是asterix中指定它们。

PROC SQL outobs=0;
    CREATE TABLE WANT as SELECT * FROM SASHELP.CLASS;
QUIT;

此致 瓦西里