我正在尝试通过宏循环的迭代创建一个数据集。我发现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;