我已经在循环中生成了Forecast_2013到2022的表格,然后将所有数据集合并到1个表格中。但现在我想在不考虑年份的情况下将数据集合并到一个循环中,明年将是2023年或2024年......我不想手动设置Forecast_2023;设置forecast_2024。如何使用宏进行循环?
Data P_OT.FORECAST(DROP=td qq AGE1 AGE2 AGE3 AGE4 AGEBANDFCST020 AGEBANDFCST030 AGEBANDFCST035P
HSI1_2012 HSI1_2013 HSI1_2014 HSI1_2015 HSI1_2016 HSI1_2017 HSI1_2018 HSI1_2019 HSI1_2020 HSI1_2021 HSI1_2022);
set FORECAST_2013;set FORECAST_2014;set FORECAST_2015;set FORECAST_2016;
set FORECAST_2017;set FORECAST_2018;set FORECAST_2019;set FORECAST_2020;
set FORECAST_2021;set FORECAST_2022;
run;
答案 0 :(得分:2)
Scott发布的替代方案:
*Assign library to folder where FORECAST_ files are located;
libname NAME 'C:\Path to Folder';
*Data step to stack files;
Data P_OT.FORECAST(DROP=td qq AGE1 AGE2 AGE3 AGE4 AGEBANDFCST020
AGEBANDFCST030 AGEBANDFCST035P HSI1_:);
set NAME.FORECAST_:;
run;
这应该与Scott使用名称前缀列表发布的结果相同,而不是使用SQL生成要合并的数据集列表和要删除的变量。
上面的代码将堆叠libname库中以“FORECAST_”开头的所有数据集。它还将删除创建的数据集中以“HSI1 _”开头的所有变量。
答案 1 :(得分:0)
您可以使用proc sql和sashelp.vcolumn表来查找所有表的名称,并创建包含它们的宏变量。为此,所有表都需要位于同一个库中,并且库中的任何其他表都不能包含FORCAST_
。 sql代码中表示memname如'%FORECAST_%'的部分正在对名为libname
的库中的所有表进行搜索,以选择包含FORCAST_
的表。 sql步骤创建了一个表的列表,然后您可以将这些表注入到数据步骤中以堆叠它们。
再次:注意,没有其他名称为FORECAST_
的表,否则它会尝试堆叠您不想要的表。确保这一点的最简单方法是在创建这些表时将它们放在自己的库中。
如果工作库中包含所有这些表格,请将libname
替换为work
我在手机上并没有检查子部分和索引部分,但如果我没记错,那应该有效。
proc sql noprint;
select "libname."||memname
into :stack_tables separated by ' '
from sashelp.vcolumn
where libname = upper("libname")
and
memname like '%FORECAST_%'
;
select "HSI1_"||substr(memname,index(memname,"_")+1,4)
into :drop_vars separated by ' '
from sashelp.vcolumn
where libname = upper("libname")
and
memname like '%FORECAST_%'
;
quit;
Data P_OT.FORECAST(DROP=td qq AGE1 AGE2 AGE3 AGE4 AGEBANDFCST020 AGEBANDFCST030 AGEBANDFCST035P
&drop_vars.);
set &stack_tables.;
run;