2013-11-25 32 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;