ТАБЛИЦЫ ЧАСТОТЫ SAS / PROC - могу ли я подавить частоты и проценты, если частота меньше заданного значения? - PullRequest
0 голосов
/ 16 мая 2018

Я использую tagsets.excelxp в SAS для вывода десятков двусторонних таблиц в файл .xml.Есть ли синтаксис, который будет подавлять строки (частоты и проценты), если частота в этой строке меньше 10?Мне нужно применить это для де-идентификации результатов, и было бы идеально, если бы я мог автоматизировать процесс, а не использовать условное форматирование в каждой из выводимых таблиц.Ниже приведен синтаксис, который я использую для создания таблиц.

ETA: мне нужно, чтобы эти подавленные значения были включены в вычисление частот и процентов столбцов, но мне нужно, чтобы они были невидимыми в финальной таблице (примеры вариантов, которые я рассмотрел: выделите серым весь ряд, сделайте шрифт белым, чтобы он не отображался для этих ячеек, замените эти значения звездочкой).

Любые предложения будут с благодарностью приняты !!!

Спасибо!

Др Дж

%include 'C:\Users\Me\Documents\excltags.tpl';

ods tagsets.excelxp file = "C:\Users\Me\Documents\Participation_rdg_LSS_3-8.xml"
    style = MonoChromePrinter
    options(
    convert_percentages = 'yes'
    embedded_titles = 'yes'
    );
    title1 'Participation';
    title2 'LSS-Level';
    title3 'Grades 3-8';
    title4 'Reading';
    ods noproctitle;

proc sort data = part_rdg_3to8;
    by flag_accomm flag_participation lss_nm;
run;

proc freq data = part_rdg_3to8;
    by flag_accomm flag_participation;
        tables lss_nm*grade_p / crosslist nopercent;
run;

ods tagsets.excelxp close;

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Я не верю, что вы можете сделать это с помощью PROC FREQ, но вы можете легко скопировать свой код с помощью PROC TABULATE и использовать там собственный формат для маскировки чисел.В этом примере устанавливается значение 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; 

Это было проверено на SAS UE.

РЕДАКТИРОВАТЬ: Забыл процентную часть, так что это скорее всего не будет работать, в первую очередь потому, что я не думаю, что вы получите проценты такие же, как в PROC FREQ (внешний вид), так что это зависит от того, насколько важноэто для вас.Другая возможность сделать это - изменить шаблон PROC FREQ для использования пользовательского формата, как указано выше.К сожалению, у меня нет времени, чтобы издеваться над вами, но, может быть, кто-то другой может.Я оставлю это здесь, чтобы помочь вам начать и удалить его позже.

0 голосов
/ 17 мая 2018

D.Jay: Proc FREQ не содержит никаких опций для условного маскирования ячеек своего вывода.Вы можете использовать возможность захвата выходных данных системы ODS с последующим отчетом Proc REPORT для получения желаемого замаскированного вывода.

Я предполагаю, что роли lss и grade_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;

Выполнить Proc FREQ

Собирать только те данные, которые соответствуют сгенерированному выводу

ods _all_ close;
* ods trace on;
/* trace will log the Output names
 * that a procedure creates, and thus can be captured
 */
ods output CrossList=crosslist;

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

ods output close;
ods trace off;

Теперь сгенерировать вывод для целевого назначения 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;

Если вам нужно создать множество перекрестных списков для разных наборов данных, код легко макросизируется.

enter image description here

0 голосов
/ 16 мая 2018

Когда я делал это в прошлом, я сначала сгенерировал частоту для набора данных, затем отфильтровал N, затем повторно напечатал набор данных (обычно используя табуляцию).

Если вы не можете идеально воссоздать таблицу частот из выходных данных freq, вы можете сделать простую частоту, проверить, какие идентификаторы или переменные или что вы хотите исключить, а затем отфильтровать их из входного набора данных иперезапустить всю частоту.

...