SAS Макрос денормализации с использованием цикла - PullRequest
1 голос
/ 01 июля 2019

Интересно, я могу сделать это в Macro Loop.

Например, это таблица A

ID  --  Fruit      --       Count
1       Banana               1
1       Strawberry           2
1       Apple                3
1       Blueberries          4
2       Apple                1
3       Strawberry           1
3       Apple                2  

Обычно я делаю это, не используя SAS MACRO

proc sql;
select ID,t2.fruit AS fruit1,
          t3.fruit AS fruit2,
          .
          .
          .
from core_table t1
LEFT JOIN TableA t2 on t2.id = t1.id AND t2.count=1 
LEFT JOIN TableA t3 on t3.id = t1.id AND t3.count=2
.
.
.
.

, поэтому вывод будет похож на

ID Fruit1      Fruit2        Fruit3    Fruit4 
1  Banana      Strawberry    Apple     Blueberries          
2  Apple                
3  Strawberry  Apple  

По сути, вывод будет денормализовать переменные.Я полагаю, что могу выполнить эту задачу с помощью цикла Do, я гуглял, но не могу понять, как это сделать.

Спасибо

Ответы [ 2 ]

4 голосов
/ 01 июля 2019

Нет необходимости в макросе для чего-то подобного.Просто используйте PROC TRANSPOSE.

Сначала давайте преобразуем ваш листинг в фактический набор данных SAS, чтобы у нас было что проверить.

data have ;
  input id fruit :$20. count;
cards;
1       Banana               1
1       Strawberry           2
1       Apple                3
1       Blueberries          4
2       Apple                1
3       Strawberry           1
3       Apple                2  
;

Вот код PROC TRANSPOSE для его преобразования.

proc transpose data=have out=want prefix=Fruit;
 by id;
 var fruit;
 id count;
run;

Результаты:

Obs    id    _NAME_    Fruit1        Fruit2        Fruit3      Fruit4

 1      1    fruit     Banana        Strawberry    Apple     Blueberries
 2      2    fruit     Apple
 3      3    fruit     Strawberry    Apple
0 голосов
/ 02 июля 2019

Proc REPORT с двумя group переменными и across переменной также представит данные в желаемой схеме вывода.

data have;
length fruit $12;
input ID  Fruit $ Count; datalines;
1       Banana               1
1       Strawberry           2
1       Apple                3
1       Blueberries          4
2       Apple                1
3       Strawberry           1
3       Apple                2  
run;

proc report data=have;
  columns ID Fruit,Count;
  define ID / group;
  define Fruit / group;
  define Count / display across ' ' ;
run;

enter image description here

...