SAS中的PROC SQL - 所有项目对

时间:2013-11-25 20:34:16

标签: sql sas

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

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;

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

这是上面的复制/粘贴版本。简单的阅读显示错误 - 香蕉苹果和苹果香蕉的重复计数行。为了达到预期的结果,需要额外的限制(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;