0

我已经循环生成了 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;
4

2 回答 2

2

斯科特发布的替代方案是:

*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_”开头的所有变量。

于 2013-11-07T19:23:15.397 回答
0

您可以使用 proc sql 和 sashelp.vcolumn 表来查找所有表的名称并创建包含它们的宏变量。为此,您的所有表都需要在同一个库中,并且库中的任何其他表都不能包含FORCAST_. 表示 memname like '%FORECAST_%' 的 sql 代码部分正在对调用的库中的所有表进行搜索,libname以选择包含FORCAST_. sql 步骤会创建一个表列表,然后您可以将其注入到数据步骤中以堆叠它们。

再次:注意没有其他名称为 like 的表,FORECAST_否则它会尝试堆叠您不想要的表。确保这一点的最简单方法是在创建这些表时将它们放入自己的库中。

如果您在工作库中有所有这些表,则替换libnamework

我在手机上,还没有检查 substr 和 index 部分,但如果我没记错的话,应该可以。

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;
于 2013-11-07T14:25:05.023 回答