如何在 SAS/IML 中使用 do 循环制作多个数据集?
How to make multiple data sets using do loops in SAS/IML?
我正在尝试以下代码:
proc IML;
do i=1 to 20;
[some codes to execute]
data[i];
end;
QUIT;
所以我期望在完成 do 循环后得到 20 个数据集。在 SAS 中可能吗?我可以使用 macro,但我不喜欢在 PROC IML
中使用宏!
提前致谢。
是的,使用模块内部的 CALL EXECUTE
子例程。
proc iml;
file LOG;
output = (1:10)`;
/*This is how you create a data set from a matrix*/
create outdata from output;
append from output;
close outdata;
/*This module will create 1 data set for each variable in OUTPUT*/
start loopit;
do i=1 to 10;
x = output[i];
/*build the string you want to execute*/
outStr = 'create outdata' + catt(i) + " from x; append from x; close outdata" + catt(i) + ";";
put outStr; /*Print the string to the log*/
/*Execute the string*/
call execute(outStr);
end;
finish loopit;
/*Call the module*/
call loopit;
quit;
如果您有 SAS/IML 12.1,它作为 SAS 9.3m2 的一部分于 2012 年 8 月发布,那么您只需将每个数据集的名称括在括号中,就像这样
proc iml;
names = "Data1":"Data20";
do i = 1 to ncol(names);
x = i;
dsname = names[i]; /* construct each name */
create (dsname) from x;
append from x;
close (dsname);
end;
完整的程序和解释见文章最后一个例子"Read data sets that are specified by an array of names."
我正在尝试以下代码:
proc IML;
do i=1 to 20;
[some codes to execute]
data[i];
end;
QUIT;
所以我期望在完成 do 循环后得到 20 个数据集。在 SAS 中可能吗?我可以使用 macro,但我不喜欢在 PROC IML
中使用宏!
提前致谢。
是的,使用模块内部的 CALL EXECUTE
子例程。
proc iml;
file LOG;
output = (1:10)`;
/*This is how you create a data set from a matrix*/
create outdata from output;
append from output;
close outdata;
/*This module will create 1 data set for each variable in OUTPUT*/
start loopit;
do i=1 to 10;
x = output[i];
/*build the string you want to execute*/
outStr = 'create outdata' + catt(i) + " from x; append from x; close outdata" + catt(i) + ";";
put outStr; /*Print the string to the log*/
/*Execute the string*/
call execute(outStr);
end;
finish loopit;
/*Call the module*/
call loopit;
quit;
如果您有 SAS/IML 12.1,它作为 SAS 9.3m2 的一部分于 2012 年 8 月发布,那么您只需将每个数据集的名称括在括号中,就像这样
proc iml;
names = "Data1":"Data20";
do i = 1 to ncol(names);
x = i;
dsname = names[i]; /* construct each name */
create (dsname) from x;
append from x;
close (dsname);
end;
完整的程序和解释见文章最后一个例子"Read data sets that are specified by an array of names."