【问题标题】:SAS Proc Tabulate - Adding Row Titles which are not part of datasetSAS Proc Tabulate - 添加不属于数据集的行标题
【发布时间】:2018-02-20 16:24:17
【问题描述】:

我正在处理索赔数据,其中我们有四种不同的遭遇类型:牙科、机构、专业和药房。我需要为 SAS Proc Tabulate 中的不同组织开发单独的报告,以显示这四种类型的索赔。一些组织有全部四种类型,而另一些组织只有 3 种。但如果一个计划没有一种特定类型,我仍然需要在报告中显示缺失值和标题。

Say 计划 A 只有机构、药房和专业类型,没有牙科索赔。我想显示列出的所有四种类型的牙科缺失值。这可以通过 Proc 制表步骤来实现吗? (或者我是否必须修改数据集以为每种类型放置空值?)任何帮助将不胜感激。

这是主要代码:

proc tabulate data=servmnth format=COMMA.0;
class plan_alias encounter_type service_Month;
var netted_claim_count;
format encounter_type $enc.;
table encounter_type= ' ' ALL='Total', sum=' '*netted_claim_count= 'Netted 
Claims by Service Month'*service_Month = ' ';
where plan_alias="&plan.";
run;

这一切都很好,直到我意识到有些计划直接缺少一两种遭遇类型。我尝试使用 proc 格式为遇到类型设置格式,但这不起作用。我想知道是否有什么可以附加到 table 语句中的 meet_type 变量,无论如何它都会显示 4 行。

【问题讨论】:

  • 您自己尝试过吗?如果是这样,请显示您的代码以帮助我们帮助您!
  • 您是否尝试过在 proc tabulate 中使用classdata 选项? This 可能会有所帮助。
  • 如果计划没有索赔,您需要报告什么?

标签: sas


【解决方案1】:

表格的classdata= 应该是您希望出现在输出中的所有维度值的显式交叉。类数据可以从允许值列表外部强制执行,也可以从列表之前的data= 生成。

考虑一些样本索赔计数数据,其特殊属性是每个计划的遇到类型都被限制为一组不同的值。

data claim_counts;
  do claim_id = 1 to 1e5;
    plan_id = floor(16 * ranuni(123));
    if plan_id = 0 then continue;
    date = mdy(ceil(12*ranuni(123)),1,2017);
    claim_count = ceil(abs(12*rannor(123)));
    member_id = 1e8 +  plan_id * 1e6 + floor(1e6 * ranuni(123));
    do until (band(plan_id,2**(encounter_type-1)));
      encounter_type = ceil(4*ranuni(123));
    end;
    output;
  end;
  format date yymmd.;
run;

类数据可以由不同的允许值列表构成

* preordained, external class data (defined dimension data);

data plans;
  do plan_id = 0 to 15;
    output;
  end;
run;

data encounter_types;
  do encounter_type = 1 to 4;
    output;
  end;
run;

data months;
  do month = 1 to 12;
    date = mdy(month,1,2017);
  end;
  format date yymmd.;
run;

* cross all allowed dimensional values for defined coverage;
 proc sql;
   create table classdata as
   select plan_id, encounter_type, date
   from plans, encounter_types, months;
quit;

或者从数据中观察到的维度覆盖构建

proc sql;
  create table classdata2 as
  select plan_id, encounter_type, date
  from (select distinct plan_id from claim_counts)
     , (select distinct encounter_type from claim_counts)
     , (select distinct date from claim_counts)
  ;

在大型数据集中,观察到的覆盖范围很可能与定义的覆盖范围相匹配

最后,在tabulate 语句中使用classdata= 选项。在下文中,我还将plan_id 添加到页面维度

的表格中
proc tabulate data=claim_counts classdata=classdata;
  class plan_id encounter_type date;
  var claim_count;

  table 
    plan_id
    ,
    encounter_type = 'type' ALL
    ,
    sum = ' ' * claim_count*f=comma9. * date = ' '
    ;
  ;
run;

页面维度将允许您一次为多个 plan_id 创建输出,并且它将识别下表所属的计划。计划识别也可以使用 by 语句或 title 语句来完成。

【讨论】:

  • 非常感谢您的详细解释和编码。这真的帮助了我!
  • 欢迎来到stackoverflow。请务必快速浏览stackoverflow.com/tour,了解有关提问和处理答案的更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多