SAS: отображение данных определенным образом - PullRequest
0 голосов
/ 02 июля 2018

(мне трудно дать хорошее описательное название, поэтому я просто спрошу на примере.)

У меня есть такой набор данных:

|ID | A1 A2 A3 | B1 B2 B3 | C1 C2 C3 |
+---+----------+----------+----------+
| 1 |  a aa aaa| b  bb bbb| c  cc ccc|
| 2 |  (... some values, etc ...) 

То, что я хочу сделать, это, учитывая "ID", сделать вывод таблицы со значениями A1, A2 и т. Д. Для этого ID, что-то вроде этого:

|   | A's | B's | C's |
+---+-----+-----+-----+
| 1 |  a  |  b  |  c  |
| 2 |  aa | bb  |  cc |
| 3 | aaa | bbb | ccc |

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

Мне не нужно возвращать таблицу данных, просто вывод на экран.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Похоже на то, что на основе данных старого стиля _null_ отчет может произвести.

data _null_;
  set have ;
  where id=1 ;
  array a a1-a3 ;
  array b b1-b3 ;
  array c c1-c3 ;
  file print;
  put @10 'A' @20 'B' @30 'C' 
   /  @10 8*'-' @20 8*'-' @30 8*'-'
  ;
  do i=1 to dim(a);
   put i 8. @10 a(i) @20 b(i) @30 c(i) ;
  end;
run;

Результаты

     A         B         C
     --------  --------  --------
   1 a         b         c
   2 aa        bb        cc
   3 aaa       bbb       ccc
0 голосов
/ 02 июля 2018

Вы можете изменить форму данных, создав транспонирующее представление , которое работает с тремя массивами параллельно. Proc REPORT или PRINT могут затем использоваться для генерации вывода презентации.

Пример данных

data have;
  do id = 1 to 10;
    array a a1-a3;
    array b b1-b3;
    array c c1-c3;

    do i = 1 to dim(a);
      a(i) = 10 ** i + id;
      b(i) = 2 * 10 ** i + id;
      c(i) = 3 * 10 ** i + id;
    end;
    output;

    keep id a: b: c:;
  end;
run;

Транспонирование вида

data have_v / view = have_v;
  set have;
  array as a1-a3;
  array bs b1-b3;
  array cs c1-c3;
  do seq = 1 to dim(as);
    a = as(seq);
    b = bs(seq);
    c = cs(seq);
    output;
  end;
  keep id seq a b c;
run;

Вывод с предложением where. Оператор BY, используемый для отображения значения id в выходных данных.

proc report data=have_v;
  by id;
  where id = 3;
  column id seq a b c;
  define id / display noprint;    
run;

Вы можете использовать VIEWTABLE и выполнить команду WHERE, если вы не хотите выводить.

Если каждая строка содержит произвольное количество «массивов» (скажем, a до z ) произвольной, но равной длины (скажем, 1 до 15 ), вы хотели бы написать макрос, который выполняет некоторую проверку метаданных рассматриваемого набора данных. Экзамен попытался бы обнаружить массив «имена» и количество элементов в каждом. Это скажем должно было бы обнаружить и вывести 15 строк по 26 столбцам для данного идентификатора.

...