【问题标题】:PROC SQL in SAS - All Pairs of ItemsSAS 中的 PROC SQL - 所有项目对
【发布时间】:2015-01-18 04:21:33
【问题描述】:

我有一个数据集,我需要在其中查看来自另一个组的所有项目对。我在下面创建了一个玩具示例来进一步解释。

BUNCH    FRUITS
1        apples
1        bananas
1        mangos
2        apples
3        bananas
3        apples
4        bananas
4        apples

我想要的是所有可能对的列表,并将它们在一堆中一起出现的频率相加。理想情况下,我的输出应该是这样的:

FRUIT1    FRUIT2     FREQUENCY
APPLES    BANANAS    3
APPLES    MANGOS     1

我的最终目标是制作一些我最终能够导入 Gephi 进行网络分析的东西。为此,我需要一个 Source 和 Target 列(上面的又名 FRUIT1 和 FRUIT2)。

我认为还有其他一些方法可以在不使用 PROC SQL(可能使用 PROC TRANSPOSE)的情况下解决此问题,但这是我开始的地方。


解决方案

感谢您的帮助。以下示例代码适用于对类似内容感兴趣的任何人:

proc sql;
    create table fruit_combo as
    select a.FRUIT as FRUIT1, b.FRUIT as FRUIT2, count(*) as FREQUENCY
    from FRUITS a, FRUITS b
    where a.BUNCH=b.BUNCH and and not a.FRUIT= b.FRUIT
    group by FRUIT1, FRUIT2;
    quit;

【问题讨论】:

    标签: sql sas


    【解决方案1】:

    最简单的方法是在 t1.ID=t2.ID 和 t1.FRUIT 和 t2.FRUIT 上对表进行笛卡尔(完全)连接。这将生成完整的组合集,然后您可以对其进行汇总。

    【讨论】:

    • 谢谢!这正是我需要做的。
    【解决方案2】:

    这是上面的复制/粘贴版本。一个简单的读数显示错误 - 香蕉苹果和苹果香蕉的重复计数行。为了达到预期的结果,需要额外的限制(a.FRUIT gt b.FRUIT)。

    data FRUITS ; 
    input  BUNCH    FRUIT $;
    cards;
    1        apples
    1        bananas
    1        mangos
    2        apples
    3        bananas
    3        apples
    4        bananas
    4        apples
    ;
    run;
    
    
    proc freq data=have ;
    tables fruits; 
    run;
    
    
    proc sql;
        create table fruit_combo as
        select a.FRUIT as FRUIT1, b.FRUIT as FRUIT2, count(*) as FREQUENCY
        from FRUITS a, FRUITS b
        where a.BUNCH=b.BUNCH 
         and a.FRUIT ne b.FRUIT
         and a.FRUIT gt b.FRUIT
        group by FRUIT1, FRUIT2;
        quit;
    
    proc print ; run;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多