0

使用 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
4

3 回答 3

1

如果您坚持使用宏,将通过双引号将宏变量解析生成正确的语句,从而将字符串文字注入提交流中。

  where Origin="&reg";
于 2020-08-26T12:59:57.220 回答
0

使用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;

输出
在此处输入图像描述

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

例子:

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

    where Origin in ("Asia", "Europe", "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;

输出
在此处输入图像描述

于 2020-08-26T11:01:04.007 回答
0

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

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
于 2020-08-26T13:23:52.407 回答