【问题标题】:Adding rows for missing values when grouping by multiple variables in proc sql在proc sql中按多个变量分组时为缺失值添加行
【发布时间】:2019-11-01 17:30:04
【问题描述】:

如标题所示,我正在尝试为 proc sql 中值为 0 的观察添加行。

当我进行频率检查时,我得到了这个:

Proc Freq

我使用此代码执行 proc sql 以按我各自的类别进行分组,该代码未能解释 proc freq 中显示的某些组合的 0 个观察结果:

proc sql; 
create table count7 as
select distinct status as d_cat, program, count(status) as count_16, 'm_cit' as m_type
from cy16
group by status, program; 
quit; 

产生: Have

我想从 Proc Freq 创建行,为那些具有 0 个观察值的类别生成行。这可以在 proc sql 中实现,还是我也需要额外的数据步骤?

【问题讨论】:

  • 你只是想模仿 PROC FREQ 吗? (如果是这样,为什么不直接使用 PROC FREQ?)或者您是否需要包含 CY16 中未出现的 STATUS 或 PROGRAM 值?如果是后者,那么 STATUS 的所有值和 PROGRAM 的所有值的列表的来源是什么?
  • 我基本上是在创建一个按程序分类的变量列表(状态和其他)。所有这些值都来自原始数据集,但我将所有这些变量(状态和其他)堆叠在一个数据集中。即使我执行 proc freq,我仍然没有让这 0 个变量显示在新数据集中。

标签: sas proc-sql


【解决方案1】:

您可以在 TABLES 语句中使用 SPARSE 选项来让 PROC FREQ 包含空单元格。在 PROC SQL 中,您需要创建一个包含所有可能组合的 shell 数据集。

让我们获取一些包含至少一个空单元格的示例数据:

data class;
 set sashelp.class;
 where age in (15 16);
run;

我们可以使用 PROC FREQ 来生成计数。

proc freq data=class;
 tables age*sex/noprint sparse out=count1(drop=percent);
run;

或PROC SQL:

proc sql ;
create table count2 as
select b.age,c.sex,coalesce(a.count,0) as COUNT 
  from (select age,sex,count(*) as COUNT 
        from class group by age,sex ) a
  full join 
       ((select distinct age from class) b
       ,(select distinct sex from class) c
       )
  on a.age=b.age and a.sex=c.sex
  order by age,sex
;
quit;

您还可以在 PROC Summary 中使用 CLASS 语句以及 COMPLETETYPES 和 NWAY 选项。

proc summary data=class complettypes nway;
 class age sex ;
 output out=count3(drop=_type_ rename=(_freq_=COUNT));
run;

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2017-09-17
    • 2020-08-28
    相关资源
    最近更新 更多