【问题标题】:SAS: Report Function troubleSAS:报告功能故障
【发布时间】:2012-05-23 07:38:05
【问题描述】:

我想在报表过程中重写数据集的代码。

1) 带有字段的数据集One (name_idtest_var)

2) test_var 可以是正数、负数、零。

3) 结果,我想要这样的表格:

name_chr test_var_pos test_var_neg test_var_zero

/*这里的数据,按name_chr分组*/

TOTAL: SUM_POS SUM_NEG SUM_ZERO

4) 附加:我有 name_id => name_chr 的字典

5)P.S:name_id 包含点!!!(我希望它们在结果表中)

6)

data result(keep=name_chr test_var_pos test_var_neg test_var_zero);
  retain name_chr "";
  retain test_var_pos  0;
  retain test_var_neg  0;
  retain test_var_zero 0;
  set One;
  by name_id;  /*already sorted by name_id*/
  if(FIRST.name_id) then do;
    name_chr="";
    test_var_pos = 0;
    test_var_neg = 0;
    test_var_zero = 0;
  end;
  else do;
    if(test_var>0) then test_var_pos=test_var_pos + test_var;
    if(test_var<0) then test_var_neg=test_var_neg + abs(test_var);
    if(test_var=0) then test_var_zero=test_var_zero + 1; /*as example, test_var_zero is    a count*/

  end;
 if (LAST.name_id) then do; 
      %mFIND(name_id,name_chr);
      output;
 end;
 run;

我想在 proc 报告中重写此代码并将 TOTAL 行添加到此数据集。

那么,我要做什么:

1) name_id 最后必须是组值。

2) 我必须计算 test_var 的所有正值、负值和零值。

 proc report data = One out = Result_table(keep= name_chr test_var_pos test_var_neg test_var_zero); 
 column name_id name_chr test_var test_var_pos test_var_neg test_var_zero;
 /*from One - table*/
 define name_id /group;
 define test_var / computed;
 /*to Result_table*/
 define name_chr / computed;
 define test_var_pos / computed;
 define test_var_neg / computed;
 define test_var_zero / computed;

 compute before name_id;  /*is this eq to FIRST?*/
    name_chr="";
    test_var_pos = 0;
    test_var_neg = 0;
    test_var_zero = 0;
 endcomp;
 compute test_var_pos;
    if(test_var>0) then test_var_pos = test_var_pos + test_var;
 endcomp;
 compute test_var_neg;
    if(test_var<0) then test_var_neg = test_var_neg + abs(test_var);
 endcomp;
 compute test_var_zero;
    if(test_var=0) then test_var_zero = test_var_zero + 1;
 endcomp;
 compute after name_id; /*is it eq to LAST?*/
    /*magic to get name_chr*/
    %mFIND(name_id,name_chr);
    /*output*/
 endcomp;
 rbreak after / summarize;
 compute after rbreak; 
   name_chr = "TOTAL: ";
 encomp;
 run;

【问题讨论】:

  • 告诉我们你的目标是什么......而不是“我该如何解决这个问题”,这里有优秀的程序员会提供好的解决方案
  • @CarolinaJay65 我想proc report 做工作,那个proc 报告不应该做。谢谢!

标签: dataset report sas


【解决方案1】:

如果您只想展示总行(CarolinaJay 就在这里),那么您可以处理数据,以便 proc report 为您创建总行。

没有任何示例数据集,我将假设 name_id 可以在您的数据集中多次使用不同的test_vars。

知道您将使用proc report 进行摘要,我可能会执行以下操作:

data prepped;
 set one;
 if test_var > 0 then test_var_pos = 1;
 else if test_var = 0 then test_var_zero = 1;
 else if test_var < 0 then test_var_neg = 1;
run;

如果您正在处理一个非常大的数据集,您可能希望按照出现次数最多的顺序对 if / else if 语句进行排序,从而可能会降低一些效率。

从那里开始,这是proc freq、proc summary、proc report 的问题,处理任何你想做的事情,那就是压缩计数。

对于name_id 的摘要以及总体摘要,您可以使用 proc 报告。同样,根据您的数据集和计算能力,它可能不是最佳选项。

与我之前使用 proc 报告的答案相同的逻辑:

proc report data = prepped out=summary nowd;
 col name_id test_var_pos test_var_zero test_var_positive;
 define name_id / group;
 rbreak after / summarize;
run;

同样,任何其他过程都可以按组为您提供摘要,然后您可以将该数据集输入proc report 以获取底部的摘要行。只需排除 name_id 上的 /group。

熟悉如何为每个 SAS 过程构建基础数据将有助于利用内置过程的强大功能。

【讨论】:

  • 所以,我必须按 name_id 进行汇总,然后用 proc report 添加总行?嗯很好:)
  • 你能用 proc 报告做这一切吗?当然,但是.....它不一定是完成所有处理的 最佳 工具。根据数据集的大小,将prepped 设为视图可能是有意义的,这样数据只会加载到内存中一次。
【解决方案2】:

Proc 报告不处理数据集...它呈现它。它可以是 HTML、PDF、RTF 等格式。典型的工作流程是使用数据步骤或程序准备数据。然后使用报告程序(如 Proc Report)呈现您的数据。

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2011-06-26
    • 2015-07-25
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多