【问题标题】:SAS Macro denormalizing by using loop使用循环对 SAS 宏进行非规范化
【发布时间】:2019-07-02 18:59:17
【问题描述】:

我想知道我可以在宏循环中做到这一点。

例如,这是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 循环来完成这项任务,我一直在谷歌搜索,但我不知道该怎么做。

谢谢

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    这样的事情不需要宏。只需使用 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
    

    【讨论】:

      【解决方案2】:

      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;
      

      【讨论】:

        猜你喜欢
        • 2013-03-08
        • 2013-06-30
        • 1970-01-01
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 2023-03-29
        相关资源
        最近更新 更多