2

在 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;

这并没有给出所有标签。我想要一张按列(欧洲、亚洲、美国)和每种汽车类型(轿车、SUV、旅行车、运动......)按列包含 3 大洲的表格。

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;

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

  1. 所有列(3 大洲),如最后一张表
  2. 只有相关的 MAKE,即 Acura 的前 6 行
  3. 像第一个 PROC TABULATE 一样的重复标签

非常感谢,

4

1 回答 1

1

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

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

我建议不要使用MATCHSUMIFS

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

  • 当它找不到您要查找的内容时会出错,这就是为什么您需要输出中的所有标签
  • 它只支持一个标准,所以你至少需要其中的 3 个
  • 它返回一个位置,所以你仍然需要一个索引函数。

因此,我建议写一个简单的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")`

它将所有计数与您正在寻找的标准相加。因为最多一行将满足这些条件,它实际上只是查找您正在寻找的计数。如果该计数不存在,它将仅返回零。

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

于 2020-06-16T09:22:34.590 回答