SAS宏使用循环反规范化

时间:2019-07-01 14:42:44

标签: sas sas-macro

我想知道我是否可以在Macro Loop中做到这一点。

例如,这是tableA

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 个答案:

答案 0 :(得分:4)

不需要像这样的宏。只需使用PROC TRANSPOSE。

首先让我们将您的列表转换成实际的SAS数据集,以便我们进行测试。

# A tibble: 3 x 3
  Ref   Pos   Alt  
  <chr> <chr> <chr>
1 S     267   P    
2 W     290   *    
3 K     650   Q    

这是将其转换的PROC TRANSPOSE代码。

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 data=have out=want prefix=Fruit;
 by id;
 var fruit;
 id count;
run;

答案 1 :(得分:0)

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