在 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 和不重复的标签。是否有中途解决方案:
- 所有列(3 个大洲)与上一列一样 table
- 只有相关的MAKEs,即讴歌的前6行
- 像第一个 PROC TABULATE 中的重复标签
非常感谢,
我建议不要将 proc tabulate
的列表导出到 excel
proc tabulate
不会为第二列中的每个值重复第一列中的值,因为输出是供人类阅读的。这不是您将数据写入 excel 以供进一步查找所需的工具。
我建议不要使用 MATCH
但 SUMIFS
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 归零。
免责声明:
我没有测试这段代码,所以如果它不起作用,请发表评论,我会的。
在 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 和不重复的标签。是否有中途解决方案:
- 所有列(3 个大洲)与上一列一样 table
- 只有相关的MAKEs,即讴歌的前6行
- 像第一个 PROC TABULATE 中的重复标签
非常感谢,
我建议不要将 proc tabulate
的列表导出到 excel
proc tabulate
不会为第二列中的每个值重复第一列中的值,因为输出是供人类阅读的。这不是您将数据写入 excel 以供进一步查找所需的工具。
我建议不要使用 MATCH
但 SUMIFS
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 归零。
免责声明: 我没有测试这段代码,所以如果它不起作用,请发表评论,我会的。