Как получить вывод SAS в виде файла Excel - PullRequest
0 голосов
/ 04 октября 2018

Скажите, что у меня есть эти данные MWE:

data v;
input var1 $ var2 var3 $;
datalines;
cat 3 yes
sheep 2 no
sheep 3 maybe
pig 3 maybe
goat 3 maybe
cat 2 no
pig 1 no
cat 2 no
pig 1 no
goat 3 no
cat 3 no
cat 2 yes
cat 1 yes
sheep 3 no 
cat 2 no
cat 1 maybe
;
run;

Я использую proc tabulate для вычисления количества наблюдений для каждого значения.Я делаю это для каждой из переменных:

proc tabulate data=v;
    class var1;
    table (var1='' all="Total"),(N pctn);
quit;   


proc tabulate data=v;
    class var2;
    table (var2='' all="Total"),(N pctn);
quit;

proc tabulate data=v;
    class var3;
    table (var3='' all="Total"),(N pctn);
quit;

Я получаю вывод, который выглядит следующим образом:

       N        PctN
cat    8        50.00
goat   2        12.50
pig    3        18.75
sheep  3        18.75
Total  16       100.00

        N       PctN
1       4       25.00
2       5       31.25
3       7       43.75
Total   16      100.00

        N       PctN
maybe   4       25.00
no      9       56.25
yes     3       18.75
Total   16      100.00

Мой вопрос: как я могу экспортировать это в Excel в следующем формате?:

Name    Cat 1   N1  N1% Cat 2   N2  N2%     Cat 3   N3  N3%     Cat 4   N4  N4%     Missing %   Total   Total%
var1    cat     8   50  goat    2   12.5    pig     3   18.75   sheep   3   18.75   0           16      100
var2    1       4   25  2       5   31.25   3       7   43.75                       0           16      100
var3    maybe   4   25  no      9   56.25   yes     3   18.75                       0           16      100

Другими словами, я хочу, чтобы у каждой переменной была своя строка.Каждое значение переменной будет отображаться в этой строке с количеством наблюдений и% от общего числа наблюдений.Последние три столбца являются бонусом, но не обязательны:% и количество пропущенных наблюдений и общее количество значений для переменной.Как я могу это сделать?

Обратите внимание, что я очень новичок в SAS.Любые улучшения в коде также приветствуются, такие как циклический или сжатый код для создания таблиц.

1 Ответ

0 голосов
/ 10 октября 2018

Желаемая форма данных является чрезвычайно запутанной и трудной для использования, так как число переменных и число их различных значений увеличивается.

Эти этапы обработки могут быть выполнены для получения структуры вывода:

  1. Транспонирование каждой строки
  2. Получение подсчетов частоты для каждой комбинации значений переменных
  3. Сканирование отсчетов по переменным и создание набора данных пар имя / значение для следующего шага.При необходимости введите строку для отсутствующего регистра.
  4. Транспонируйте пары имя / значение в широкую структуру
  5. Экспортируйте по желанию

Пример

В данных есть четвертая переменная, в которой отсутствуют некоторые значения.

data have;
input var1 $ var2 var3 $ var4;
datalines;
cat 3 yes .
sheep 2 no .
sheep 3 maybe .
pig 3 maybe .
goat 3 maybe 1 
cat 2 no 1
pig 1 no 1
cat 2 no 1
pig 1 no 1
goat 3 no 1
cat 3 no 1
cat 2 yes 1
cat 1 yes 1
sheep 3 no 1
cat 2 no 2
cat 1 maybe 1
;
run;

options missing = ' ';
proc transpose data=have_v out=vector1(index=(_name_));
  by rowid;
  var var1 var2 var3 var4;
run;

proc freq noprint data=vector1;
  by _name_;
  table col1 / missing out=freqs;
run;
options missing = '.';

data freqs_0;
  set freqs;
  by _name_;

  retain nomiss;
  if first._name_ then nomiss = not missing(col1);

  if first._name_ then seq=1; else seq+1;

  seqc = cats(seq);

  if first._name_ and missing(col1) then do;
    seqc = 'missing';
    seq = 0;
  end;

  length widename $32;

  if seqc ne 'missing' then do;
    widename = cats("cat_",seqc);
    widevalue = col1;
    output;
  end;

  widename = cats("cat_",seqc,'_COUNT');
  widevalue = COUNT;
  output;

  widename = cats("cat_",seqc,'_PERCENT');
  widevalue = PERCENT;
  output;

  if last._name_ and nomiss then do;
    seqc = 'missing';

    widename = cats("cat_",seqc,'_COUNT');
    widevalue = 0;
    output;

    widename = cats("cat_",seqc,'_PERCENT');
    widevalue = 0;
    output;

  end;
  keep _name_ widename widevalue;
run;

proc transpose data=freqs_0 out=wide;
  by _name_;
  id widename;
  var widevalue;
run;
...