宏循环可按来源生成Proc制表符

问题描述

我想使用SASHELP.CARS,按原产地进行PROC TABULATE。因此,第一种方法是制作3个PROC TABULATE,例如:

    PROC TABULATE DATA = data out=tabulate;
    where Origin="Asia";
    CLASS Make DriveTrain   ; 
    TABLE (Make),(DriveTrain)   / nocellmerge ; 
    run;

但是,相反,我想在宏循环中自动执行此操作(这是我做的一个简单示例。我使用的实际数据库更加复杂;这就是为什么我需要创建宏:)的原因。您能否帮助我,为什么以下代码不起作用?似乎是问题所在的« where Origin = reg; »部分。谢谢 !所以这是我的代码:

data data; set sashelp.cars;run;

data classes;
input id_reg reg_name $ ; 
cards;
1 Asia 
2 Europe 
3 USA 
run;

%macro comp;
%local i reg;

    %do i=1 %to 3;

        proc sql ;
        select reg_name
        into
        :reg_name 
        from classes
        where id_reg = &i.;
        quit;
        %let reg=reg_name;

        PROC TABULATE DATA = data out=tabulate_&i;
        where Origin=reg;
        CLASS Make DriveTrain   ; 
        TABLE (Make),(DriveTrain)   / nocellmerge ; 
        run;

    %end;
%mend comp;
%comp

解决方法

如果您坚持使用Macro,将双引号宏变量的解析度生成正确的语句,以便将字符串文字注入到提交流中。

  where Origin="&reg";
,

使用BY语句像数据集的分组子集那样独立处理。 使用WHERE语句选择要处理的子集。

示例:

ods html file='output.html' style=plateau;

proc sort data=sashelp.cars out=cars_sorted;
  by origin;
run;
  
title;footnote;
options nocenter nodate nonumber;

PROC TABULATE DATA=cars_sorted;

    by origin;
    where Origin in ("Asia","Europe","USA");

    where also make >= 'P';   * further subset for reduced size of output screen shot;


    CLASS Make DriveTrain   ; 
    TABLE (Make),(DriveTrain)   / nocellmerge ; 

run;

ods html close;

输出
enter image description here

或者,使用TABLE形式的<page dimension>,<row dimension>,<column dimension>语句代替BY组处理。这种格式不需要预先排序的数据,因为格式是根据CLASS变量构造的。

示例:

PROC TABULATE DATA=sashelp.cars;   /* original data,not sorted */

    where Origin in ("Asia","USA");

    where also make >= 'P';   * further subset for reduced size of output screen shot;

    CLASS Origin Make DriveTrain   ;  /* Origin added to CLASS */

    TABLE Origin,(Make),(DriveTrain)   / nocellmerge ;  /* Origin is page dimension */

run;

输出
enter image description here

,

非常感谢!这是有效的代码:

data data; set sashelp.cars;run;

data classes;
input id_reg reg_name $ ; 
cards;
1 Asia 
2 Europe 
3 USA 
run;

%macro comp;
%local i ;

    %do i=1 %to 3;

        proc sql ;
        select reg_name
        into
        :reg_name 
        from classes
        where id_reg = &i.;
        quit;

        PROC TABULATE DATA = data(where=(Origin="&reg_name")) out=tabulate_&i;
        CLASS Make DriveTrain   ; 
        TABLE (Make),(DriveTrain)   / nocellmerge ; 
        run;

    %end;
%mend comp;
%comp

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...