SAS/PROC FREQ表格-如果频率小于给定值,是否可以抑制频率和百分比?

SAS/PROC FREQ表格-如果频率小于给定值,是否可以抑制频率和百分比?,sas,excel-2010,suppress,ods,Sas,Excel 2010,Suppress,Ods,我在SAS中使用tagsets.excelxp将几十个双向表输出到一个.xml文件中。如果行中的频率小于10,是否存在抑制行(频率和百分比)的语法?我需要应用它来取消识别结果,如果我可以自动化这个过程,而不是在每个输出表中使用条件格式,那将是非常理想的。下面是我用来创建表的语法 ETA:我需要在列频率和百分比的计算中包含这些被抑制的值,但我需要它们在最终表格中不可见(我考虑过的选项示例:将整行变灰,将字体变白,以便这些单元格不显示,用星号替换这些值) 任何建议都将不胜感激 谢谢 j博士 过去我这

我在SAS中使用tagsets.excelxp将几十个双向表输出到一个.xml文件中。如果行中的频率小于10,是否存在抑制行(频率和百分比)的语法?我需要应用它来取消识别结果,如果我可以自动化这个过程,而不是在每个输出表中使用条件格式,那将是非常理想的。下面是我用来创建表的语法

ETA:我需要在列频率和百分比的计算中包含这些被抑制的值,但我需要它们在最终表格中不可见(我考虑过的选项示例:将整行变灰,将字体变白,以便这些单元格不显示,用星号替换这些值)

任何建议都将不胜感激

谢谢

j博士


过去我这样做时,首先生成数据集的频率,然后过滤掉N,然后重新打印数据集(通常使用表格)


如果您不能从freq输出完美地重新创建频率表,您可以执行简单的频率,检查哪些ID或变量或您要排除的内容,然后从输入数据集中筛选出它们并重新运行整个频率。

我不相信您可以使用PROC freq,但是,您可以使用PROC TABLATE轻松地复制代码,并且可以在那里使用自定义格式来屏蔽数字。此示例将其设置为M表示缺失,将其设置为N表示小于5,并将其余值设置为小数点后一位。您还可以用一个空格(单个空格)替换M/N,使其不显示任何值

*Create a format to mask values less than 5;
proc format;
 value mask_fmt

. = 'M' /*missing*/
 low - < 5='N' /*less than 5 */
 other = [8.1]; /*remaining values with one decimal place*/
run;

*sort data for demo;
proc sort data=sashelp.cars out=cars;
 by origin;
run;

ods tagsets.excelxp file='/folders/myfolders/demo.xml';


*values partially masked;
proc tabulate data=cars;
 where origin='Asia';
 by origin;
 class make cylinders;
 table make, cylinders*n*f=mask_fmt. ;
run;

ods tagsets.excelxp close; 
*创建一种格式来屏蔽小于5的值;
proc格式;
值掩码
. = 'M'/*缺失*/
低-<5='N'/*小于5*/
其他=[8.1]/*小数点后一位的剩余值*/
跑
*为演示整理数据;
proc sort data=sashelp.cars out=cars;
按原产地;
跑
ods tagsets.excelxp文件='/folders/myfolders/demo.xml';
*部分掩盖的价值观;
proc表格数据=车辆;
“亚洲”的起源地;
按原产地;
制造钢瓶;
表制作,气缸*n*f=遮罩;
跑
ods tagsets.excelxp关闭;
这是在SAS UE上测试的


编辑:忘记了百分比,所以这可能不适用,主要是因为我认为您不会得到与PROC FREQ(外观)中相同的百分比,所以这取决于它对您的重要性。实现这一点的另一种可能性是修改PROC FREQ模板以使用上述自定义格式。不幸的是,我没有时间为你模拟这个,但也许其他人可以。我将把这个留在这里,以帮助您开始并在以后删除它

D.Jay:Proc FREQ不包含任何用于有条件屏蔽其输出单元格的选项。您可以利用ODS系统的输出数据捕获能力和后续Proc报告来生成所需的屏蔽输出

我猜测
lss
grade\u p
的作用分别是技能水平和学生水平

生成一些样本数据

data have;
  do student_id = 1 to 10000;
    flag1 = ranuni(123) < 0.4;
    flag2 = ranuni(123) < 0.6;
    lss = byte(65+int(26*ranuni(123)));
    grade = int(6*ranuni(123));

    * at every third lss force data to have a low percent of grades < 3;
    if mod(rank(lss),3)=0 then
      do until (grade > 2 or _n_ < 0.15);
        grade = int(6*ranuni(123));
        _n_ = ranuni(123);
      end;
    else if mod(rank(lss),7)=0 then
      do until (grade < 3 or _n_ < 0.15);
        grade = int(6*ranuni(123));
        _n_ = ranuni(123);
      end;

    output;
  end;
run;

proc sort data=have;
  by flag1 flag2;
  *where lss in ('A' 'B') and flag1 and flag2; * remove comment to limit amount of output during 'learning the code' phase;
run;
现在生成到目标ODS目的地的输出(可以是ExcelXP、html、pdf等)

需要生成具有屏蔽值的等效参考输出

* regular output of FREQ, to be compare to masked output
* of some information via REPORT;

proc freq data=have;
  by flag1 flag2;
  tables lss * grade / crosslist nopercent;
run;
Proc REPORT具有生成条件输出的强大功能。计算块用于为输出选择值或屏蔽值指示器

options missing = ' ';

proc format;
  value $lss_report ' '= 'A0'x'Total';
  value grade_report . = 'Total';
  value blankfrq .b = '*masked*' ._=' ' other=[best8.];
  value blankpct .b = '*masked*' ._=' ' other=[6.2];

proc report data=CrossList;
  by flag1 flag2;
  columns
    ('Table of lss by grade'
    lss grade 
    Frequency RowPercent ColPercent
    FreqMask RowPMask ColPMask
    )
  ;
  define lss / order order=formatted format=$lss_report. missing;
  define grade / display format=grade_report.;
  define Frequency / display noprint;
  define RowPercent / display noprint;
  define ColPercent / display noprint;
  define FreqMask / computed format=blankfrq. 'Frequency' ;
  define RowPMask / computed format=blankpct. 'Row/Percent';
  define ColPMask / computed format=blankpct. 'Column/Percent';

  compute FreqMask;
    if 0 <= RowPercent < 10 
      then FreqMask = .b;
      else FreqMask = Frequency;
  endcomp;
  compute RowPMask;
    if 0 <= RowPercent < 10
      then RowPMask = .b;
      else RowPMask = RowPercent;
  endcomp;
  compute ColPMask;
    if 0 <= RowPercent < 10 
      then ColPMask = .b;
      else ColPMask = ColPercent;
  endcomp;
run;

ods html close;
缺少选项=“”;
proc格式;
价值$lss_报告“”='A0'x'Total';
价值等级报告总数';
值blankfrq.b='*屏蔽*'。=''其他=[best8.];
值blankpct.b='*屏蔽*'。=''其他=[6.2];
过程报告数据=交叉列表;
由flag1 flag2;
柱
(“按等级划分的lss表”
lss等级
频率行百分比
频率掩码RowPMask ColPMask
)
;
定义lss/订单=格式化格式=$lss\U报告。丢失的
定义等级/显示格式=等级报告。;
定义频率/显示noprint;
定义行百分比/显示noprint;
定义ColPercent/display noprint;
定义FreqMask/computed format=blankfrq'频率';
定义行pmask/computed format=blankpct'行/百分比';
定义ColPMask/computed format=blankpct'列/百分比';
计算频率掩模;

谢谢你,乔!问题是,我需要在计算列频率和百分比时计算这些值。我只需要它们在最后一个表中不可见(我考虑过的选项示例:将整行变灰,将字体变为白色,使这些单元格不显示,用星号替换这些值)。嗯…@doctorjay在很大程度上这不是我建议的解决方案的问题。您可以简单地以初始频率进行所有这些边缘计算,然后过滤掉不需要的行,然后进行更简单的制表(或
PROC REPORT
偶数),从中输出数据。只有当您有非常具体的输出需求,恰好与
proc freq
或其他任何文件的原始格式完全匹配,而您无法从
proc report
获得时,才会出现不确定的位。然后你要么以更高的难度滚动你自己的摘要,要么使用定制的权重,这很难做到。有趣。非常感谢。我能看到的唯一缺点是,我仍然必须手动识别不需要的行,这可能需要几个小时。但我肯定会将其归档以获得较小的输出集-我会进行大量的反识别。非常感谢!手动?我希望你能有一些自动完成的方法,但如果你不这样做,那肯定会很混乱。你甚至可以让Excel进行筛选和删除,如果这对你来说更容易的话。你能说一下为什么目标是tagsets.ExcelXP而不是Excel吗?当然!我有9.3,ODS Excel只从9.4开始提供。这是一个非常迟的版本
* regular output of FREQ, to be compare to masked output
* of some information via REPORT;

proc freq data=have;
  by flag1 flag2;
  tables lss * grade / crosslist nopercent;
run;
options missing = ' ';

proc format;
  value $lss_report ' '= 'A0'x'Total';
  value grade_report . = 'Total';
  value blankfrq .b = '*masked*' ._=' ' other=[best8.];
  value blankpct .b = '*masked*' ._=' ' other=[6.2];

proc report data=CrossList;
  by flag1 flag2;
  columns
    ('Table of lss by grade'
    lss grade 
    Frequency RowPercent ColPercent
    FreqMask RowPMask ColPMask
    )
  ;
  define lss / order order=formatted format=$lss_report. missing;
  define grade / display format=grade_report.;
  define Frequency / display noprint;
  define RowPercent / display noprint;
  define ColPercent / display noprint;
  define FreqMask / computed format=blankfrq. 'Frequency' ;
  define RowPMask / computed format=blankpct. 'Row/Percent';
  define ColPMask / computed format=blankpct. 'Column/Percent';

  compute FreqMask;
    if 0 <= RowPercent < 10 
      then FreqMask = .b;
      else FreqMask = Frequency;
  endcomp;
  compute RowPMask;
    if 0 <= RowPercent < 10
      then RowPMask = .b;
      else RowPMask = RowPercent;
  endcomp;
  compute ColPMask;
    if 0 <= RowPercent < 10 
      then ColPMask = .b;
      else ColPMask = ColPercent;
  endcomp;
run;

ods html close;