使用空心基础附加Proc时定义基础结构

  • 本文关键字:定义 结构 Proc 空心 sas
  • 更新时间 :
  • 英文 :


我正在尝试通过宏循环的迭代创建一个数据集。我发现Proc附加不需要定义的基础才能使用,因此方法应该可行。但是,我遇到了一个具有可变名称长度的问题。

我创建了一个简单,可重复的示例,证明了我的问题。当然,这不是创建我最终want数据集的最有效方法,但是此过程模拟了我的代码中的工作流程。

proc sql;
    select name from sashelp.class;
    select name
        into :name_1 - :name_&sqlobs
    from sashelp.class;
quit;
%macro forward_loop;
%do i = 1 %to 10;
    proc sql;
    create table temp as
    select
    "&&name_&i" as name,
    age
    from sashelp.class
    quit;
    proc append base=want data=temp;
    run;
%end;
%mend;
%forward_loop;

注意:附加工作。

警告:可变名称在基础和数据文件上的长度不同(基本6数据7(。

错误:由于上面列出的异常,没有进行附加操作。使用强制选项附加这些文件。

注意:添加了0个观测值。

我相信我可以通过简单地指定name的填充到一定的标准长度来在PROC SQL步骤中解决此问题。但是,我无法弄清楚如何做到这一点。

这是正确的方法吗?还是有一种方法可以创建基础结构而没有基本中的任何数据?

如果创建始终结构化的数据集,那么让Proc附加创建基本数据集从第一个增量数据集创建可以正常工作。

在您的示例中,您是从字符串文字创建名称的情况下,而不告诉SAS使变量多长时间。因此,默认情况下,只要字符串文字就可以创建它。如果您真的在Proc SQL中使用该方法,请在选择语句中的列定义中添加长度属性。

"&&name_&i" as name length=8

如果您实际上是使用数据步骤进行的,则在分配变量值之前定义长度。

length name $8;
name = "&&name_&i";

,但最好在输入循环之前先定义基本数据集。

data want;
  length name $8 age 8 ;
  stop;
run;

只需使用DataStep创建数据集即可。stop将确保不会进行观察。但是您还必须使用FORCE将较小的数据集中到数据集中。

data want;
  length name $7;
  stop;
run;

替代方案以相同的方式创建基本数据集,但使用插入而不是Proc Append。

很难理解您的示例是否实际上是您想做的。

定义proc sql的名称长度。

proc sql noprint;
    *select name from sashelp.class;
   select name into :name_1- from sashelp.class;
   quit;
%put _global_;
%macro forward_loop;
%do i = 1 %to 10;
   proc sql;
      create table temp_&i as
      select 
      "&&name_&i" as name length=8,
      age
      from sashelp.class
      quit;
   %end;
   %mend;
   options mprint=1;
   %forward_loop;
data want;
   if 0 then set sashelp.class(keep=name age);
   set temp_: open=defer;
   run;

最新更新