【问题标题】:Export/Import Attributes of a SAS datasetSAS 数据集的导出/导入属性
【发布时间】:2023-03-10 14:55:01
【问题描述】:

我正在处理多轮调查数据。我已经完成了为第一波数据定义格式和标签。

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

我发现最接近的东西是 PROC CPORT,但我完全被它弄糊涂了,无法让它运行。


(为了清楚起见,我也会用另一种方式问这个问题......)

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

我有第二个具有完全相同变量名称的数据集。我想将第一个数据集中的变量属性用于第二个数据集中的变量。有没有办法做到这一点?

谢谢!

【问题讨论】:

  • 在第二个数据集中使用第一个数据集的变量属性是什么意思?这是在 proc 导入步骤中,将格式/标签应用于最终数据集吗?

标签: sas


【解决方案1】:

所以你有一个 MODEL 数据集和一个 HAVE 数据集,两者都包含数据。您想创建 WANT 数据集,其中包含来自 HAVE 的数据,具有 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;

【讨论】:

    【解决方案2】:

    我会在现有数据集的基础上创建一个空数据集,然后使用 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;
    

    请注意,我在proc append 上使用了forcenowarn 选项。即使在使用的两个数据集之间发现差异,这也将确保附加数据。例如,如果您有格式差异,这是预期的。它还会隐藏诸如新表中是否存在旧表中不存在的列等内​​容。因此请注意,这是在做你想做的事情。如果该行为不受欢迎,请考虑使用 datastep 来代替(并首先列出 want 数据集)。

    【讨论】:

      【解决方案3】:

      欢迎来到堆栈。

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

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

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

      问候, 瓦西里

      【讨论】:

        猜你喜欢
        • 2020-12-16
        • 2016-12-18
        • 2021-01-21
        • 1970-01-01
        • 2012-07-15
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        相关资源
        最近更新 更多