2013-11-25 22 views
6

Ho un set di dati in cui ho bisogno di guardare tutte le coppie di elementi che sono insieme da un altro gruppo. Ho creato un esempio di gioco qui sotto per ulteriori spiegazioni.PROC SQL in SAS - Tutte le coppie di articoli

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

Quello che voglio è un elenco di tutte le possibili coppie e riassumere la frequenza si verificano insieme all'interno di un mazzo. La mia uscita sarebbe idealmente simile a questa:

FRUIT1 FRUIT2  FREQUENCY 
APPLES BANANAS 3 
APPLES MANGOS  1 

Il mio obiettivo finale è quello di fare qualcosa che sarò finalmente in grado di importare in Gephi per un'analisi della rete. Per questo ho bisogno di una colonna Source e Target (aka FRUIT1 e FRUIT2 sopra).

Penso che ci siano alcuni altri modi per avvicinarsi a questo anche senza usare PROC SQL (forse usando PROC TRANSPOSE) ma questo è il punto in cui ho iniziato.


SOLUZIONE

Grazie per l'aiuto. Il codice di esempio sotto per chiunque sia interessato a qualcosa di simile:

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; 

risposta

4

approccio più semplice è quello di fare un cartesiano (completa) si uniscono al tavolo a se stesso, il t1.ID = t2.ID e t1.FRUIT ne t2.FRUIT . Questo genererà il set completo di combinazioni, che potrai quindi riassumere.

+0

Grazie! Questo era esattamente quello che dovevo fare. – pmbaumgartner

0

Ecco la versione di copia/incolla di sopra. Una semplice lettura mostra errori: righe di conteggi duplicate per banana-mela e mela-banana. Per ottenere il risultato desiderato era necessaria una restrizione aggiuntiva (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; 
Problemi correlati