SAS初学者。我做了一个宏,从不同库的数据集创建表(每年有一个库(。proc tabulate
部分工作良好。我的问题是,我想将每个表导出到同一Excel文件中的一个工作表,并且每个工作表都标记有宏变量";年";。最后,我想要一个Excel文件,里面有20、19、18、17、16、15和14页。
我通过插入一个ods tagsets.excelxp
命令来尝试这一点,因为这是导出命令,它也在语法的其余部分中使用;"继承";。结果是一个Excel文件,其中有一张名为"&年"(不是"14"(和来自上一次宏调用(第14年(的数据。
有人知道如何解决这个问题吗?此外,我也很乐意提出一种比调用宏7次更优雅的方式。就像在一张年份表上循环一样。
%macro MyMacro (year = );
%local indsn;
%let indsn=path&year..myfile1;
ods tagsets.excelxp File='P:FolderFolderFolderMyMacro.xls' style=statistical options(sheet_name='&year.');
proc tabulate data=&indsn;
class var1 var2;
table var1 all, var2 all/printmiss;
title "var1 and var2, year: &year.";
run;
ods tagsets.excelxp close;
%mend MyMacro;
%MyMacro(year=20)
%MyMacro(year=19)
%MyMacro(year=18)
%MyMacro(year=17)
%MyMacro(year=16)
%MyMacro(year=15)
%MyMacro(year=14)
对于这类内容,通常使用BY
语句。
proc sort data=sashelp.cars out=work.cars;
by origin;
run;
ods excel file="path/file.xlsx";
proc tabulate data=work.cars;
by origin;
class make type;
table make all, type all / printmiss;
run;
ods excel close;
ODS
语句告诉SAS ODS输出的目的地。这取决于您的系统和许可证,您可以使用哪个excel导出。我选择了excel
而不是excelxp
,因为它生成的是xlsx
而不是xls
。
BY
语句将输出分组到不同的表中,并将输出写入不同的excel表中。
此外,宏并不是真正需要的。如果输入数据集的名称正确(例如basename_year
(,您可以使用将所有数据集读取到一个数据集中
data all_years;
set basename_: indsname=dsn;
run;
然后如果CCD_ 11字符串不包含在每个单独的数据集中,则使用该字符串来提取年份。