Sas 在proc summary中按两个类变量排序,包括所有缺少的类组合

Sas 在proc summary中按两个类变量排序,包括所有缺少的类组合,sas,Sas,原始数据 GrantNumber ServiceID Region1 Total 1 1 1 50 1 2 1 60 2 1 2 70 我需要输出包含缺少的类变量组合。然后,我希望根据这两个类变量ServiceID和Region1对输出进行排序 实例 ServiceID、Region1和T

原始数据

GrantNumber    ServiceID   Region1   Total

    1             1          1        50
    1             2          1        60
    2             1          2        70
我需要输出包含缺少的类变量组合。然后,我希望根据这两个类变量ServiceID和Region1对输出进行排序 实例 ServiceID、Region1和Total是列标题

ServiceID Region1      Total

1         Atlantic     50
2         Atlantic     40
3         Atlantic     30
1         West         20
2         West         10
3         West         .
4         West         .
我试图包含completetypes以与PrelofMT交互,并通过一个类变量对其进行排序,但它不起作用

 Proc summary data=Allocate.Merge_All_s1 nway completetypes ;
 By ServiceID;
 Types ServiceID*Region1;
 Class Region1 ServiceID / preloadfmt missing ;
 Var  Total
 output out=Allocate.Merge_All_s_Aggregate  sum=/keepLen;
 run;

 Data Allocate.Merge_All_final;
 set Allocate.Merge_All_s_Aggregate(Keep=ServiceID Region1 Total);
 run;

 ODS HTML File= "\Results12.XLS";
 Proc Print Data=Allocate.Merge_All_final ;
 Run;
 ODS HTML Close;
摘要程序文件将显示缺少的选项

控制分类级别 … 丢失的 使用缺少的值作为有效值来创建类变量的组合

您还可以使用CLASS语句上的相同选项指定一个或多个变量以将missing用作分类级别

  CLASS ServiceID / MISSING;
看起来您需要CLASSDATA选项。让我们给它一个包含所有可能组合的数据集

data classdata;
  if 0 then set have(keep=ServiceId region);
  do ServiceId =1 to 4;
    do Region1 = 1 to 2;
      output;
    end;
  end;
run;
因此,创建一个包含所有组合的数据集

data classdata;
  if 0 then set have(keep=ServiceId region);
  do ServiceId =1 to 4;
    do Region1 = 1 to 2;
      output;
    end;
  end;
run;
制作类数据的另一个简单方法是在procsql中使用来自各个列表的完全连接

proc sql;
  create table classdata as select * 
  from (select distinct serviceid from master_list_of_service_ids)
     , (select distinct region1 from master_list_of_regions)
  ;
quit;
然后将其传递给PROC SUMMARY/MEANS

proc summary data=have classdata=classdata nway;
  class Region1 ServiceID ;
  var total;
  output out=want sum= ;
run;
结果:

                  Service
Obs    Region1       ID      _TYPE_    _FREQ_    Total

 1        1          1          3         1        50
 2        1          2          3         1        60
 3        1          3          3         0         .
 4        1          4          3         0         .
 5        2          1          3         1        70
 6        2          2          3         0         .
 7        2          3          3         0         .
 8        2          4          3         0         .

你看了我的真实要求了吗?你的回答不适用于我的问题,也不起作用。但是感谢您尝试@RichardSo的缺失,您并不是指数据中缺失值,而是指可能值列表中的值,但这些值恰好没有出现在这个数据样本中?为什么您同时使用by和CLASS?为什么不直接将SERVICEID添加到CLASS语句而不是使用BY语句?请包含示例数据,说明原始数据的结构和预期输出-我相信这是第一个表,但我编辑了您的帖子以使其易读。请确保您的问题格式正确,这有助于您获得更快的答案。我已经包括了一个原始数据@Reezaby missing的示例,我的意思是没有值的类的组合示例输出@Tomif Region1的最后两行是非数字字符变量,我需要为它们指定一个数字吗@托马诺。只需使用不同的方法创建CLASSDATA数据集。我只是使用了一个简单的DO循环,因为您的示例值是整数。如何确保在classdataset中包含missing。还有一件事,当我运行我的代码时,我得到了这个错误。在预加载数据集中找不到类变量Region2,或者与同名的主数据集变量不兼容@Tom您需要拥有所有的类变量。让我更新一下,以演示如何将多个单变量表转换为一个多变量类数据集。如果您想在CLASSDATA中包含missing,那么请使用与任何其他值相同的方法。但确保在PROC SUMMARY中使用MISSING选项,以便将实际数据中缺少的值包括在内。还是要求删除nWORE选项并包含不考虑所有类变量的摘要?我如何通过这个错误类变量区域1在预加载数据集中找不到,或者与名为“汤姆”的主数据集变量不兼容。