在 SAS 中使用 PROC TABULATE 的带有重复标签的标准化表

Standardized tables with repeated labels using PROC TABULATE in SAS

在 SAS 中,我需要一个 PROC TABULATE 重复标签的地方,以便 Excel 使用 INDEX-MATCH 更容易找到它们。这是 sashelp.cars.

的示例

第一个 PROC TABULATE 具有重复标签的优点,这是 INDEX-MATCH 所需要的。但是,它的缺陷是 SAS 只给出非缺失值。

data cars;
set sashelp.cars;  
run;

proc sort data=cars;
by make;
run;

这并没有给出所有标签。我想要 table 包含 3 个大洲(欧洲、亚洲、美国)和每种车型(轿车、SUV、Wagon、Sports...)。

PROC TABULATE DATA = cars;
option missing=0;
by make;
CLASS make type Type Origin / mlf MISSING  ; 
TABLE (
(type*make)
), (Origin='')   / printmiss nocellmerge ; RUN;

因此,为了按列获得所有 3 个大洲和每种类型的汽车(轿车、SUV、旅行车、运动车...),我按照建议使用 CLASSDATA:

Data level; 
    set cars;
    keep make type Type Origin;
Run;

PROC TABULATE DATA = cars MISSING classdata=level;
    option missing=0;
    by make;
    CLASS make type Type Origin / mlf MISSING  ; 
    TABLE (
    (make*type)
    ), (Origin='')   / printmiss nocellmerge ; 
RUN;    

Data level; 
    set cars;
    keep make type Type Origin;
Run;

PROC TABULATE DATA = cars MISSING classdata=level;
    option missing=0;
    by make;
    CLASS make type Type Origin / mlf MISSING  ; 
    TABLE (
    (make*type)
    ), (Origin='')   / printmiss nocellmerge ; 
RUN;

但这给出了一个巨大的 table 和不重复的标签。是否有中途解决方案:

  1. 所有列(3 个大洲)与上一列一样 table
  2. 只有相关的MAKEs,即讴歌的前6行
  3. 像第一个 PROC TABULATE 中的重复标签

非常感谢,

我建议不要将 proc tabulate 的列表导出到 excel

proc tabulate 不会为第二列中的每个值重复第一列中的值,因为输出是供人类阅读的。这不是您将数据写入 excel 以供进一步查找所需的工具。

我建议不要使用 MATCHSUMIFS

MATCH 在 excel 中是一个很棒的函数,但对于您的应用程序来说不是一个好的选择,因为

  • 当它找不到你要找的东西时会报错,这就是为什么你需要输出中的所有标签
  • 它只支持一个标准,所以你至少需要3个
  • 它return是一个位置,所以你还需要一个索引函数。

因此,我建议写一个简单的create table

PROC sql;
   create table TO_EXPORT as 
   select REGION, MACTIV, DATE, count(*) as cnt
   from data
   group by REGION, MACTIV, DATE;
proc export data = TO_EXPORT file="&myFolder\&myWorkbook..xlsx" replace;
RUN;

您的数据将以更面向数据的格式存储在 Excel 中。

要检索数据,我建议使用以下类型的 excel 公式

=sumifs($D:$D,$A:$A,"13-*",$B:$B,$C:$C,"apr2020")`

它将所有计数相加,其中左侧为您要查找的条件。 因为最多一行会满足这些条件,所以它实际上只是查找您要查找的计数。 如果该计数不存在,它将 return 归零。

免责声明: 我没有测试这段代码,所以如果它不起作用,请发表评论,我会的。