2013-11-25 30 views
6

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

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的网络分析。为此,我需要一个源和目标列(又名FRUIT1和FRUIT2)。

我认为还有其他一些方法来处理这个问题,而不使用PROC SQL(也许使用PROC TRANSPOSE),但这是我开始的地方。


SOLUTION

感谢您的帮助。下面的示例代码有兴趣的人类似的东西:

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; 

回答

4

最简单的方法是做一个笛卡尔(全)表的加盟本身就t1.ID = t2.ID和t1.FRUIT NE t2.FRUIT 。这将生成完整的组合集,然后您可以总结。

+0

谢谢!这正是我需要做的。 – pmbaumgartner

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;