2015-01-27 14 views
5

Es könnte eine Version von tcrosssprod sein, die dies erreicht, aber ich konnte es nicht finden. Aus dem folgenden Beispiel, wie bekomme ich nur Zeilen mit dem ersten Auftreten einer Kombination, wenn Reihenfolge keine Rolle spielt? I.e. (1,2) für mich ist das gleiche wie (2,1).R tcrosssprod mit einzigartigen Kombinationen

a <- c(1,2,3,4) 
b <- c(10,5,4,10) 
df<- data.frame(a,b) 

melt(tcrossprod(df$b,1/df$b)) 

> melt(tcrossprod(df$b,1/df$b)) 
    Var1 Var2 value 
1  1 1 1.00 
2  2 1 0.50 
3  3 1 0.40 
4  4 1 1.00 
5  1 2 2.00 
6  2 2 1.00 
7  3 2 0.80 
8  4 2 2.00 
9  1 3 2.50 
10 2 3 1.25 
11 3 3 1.00 
12 4 3 2.50 
13 1 4 1.00 
14 2 4 0.50 
15 3 4 0.40 
16 4 4 1.00 
+1

bisschen wie ein Hack funktioniert aber: 'tt <- tcrossprod (df $ b, 1/df $ b); tt [obere.tri (tt)] <- NA; reshape2 :: schmelzen (tt, na.rm = T); ' – user20650

+0

@ user20650 Ich denke, die ersten Vorkommen in der Tabelle entsprechen dem unteren Dreiecksbereich, sollten' lower.tri' anstatt 'upper.tri' und verwenden sollte zusätzlich das Argument 'diag = TRUE' verwenden, da wir auch diese diagonalen Elemente haben wollen. – tkmckenzie

+0

Hallo @ tkmckenzie; Probieren Sie den Code - ich denke, es erzeugt die richtige Reihenfolge und wir wollen nicht 'diag = TRUE', da dies die diagonalen Einträge auf' NA' setzen wird – user20650

Antwort

4

Mit m <- melt(tcrossprod(df$b,1/df$b)), können Sie einfach tun:

subset(m,X1>X2) 

# X1 X2 value 
#2 2 1 0.5 
#3 3 1 0.4 
#4 4 1 1.0 
#7 3 2 0.8 
#8 4 2 2.0 
#12 4 3 2.5 
+0

Sollte wahrscheinlich "Teilmenge (m, X1> = X2)" –

+0

Sicher, es könnte X1> = X2, wenn für diagonale Elemente benötigt werden. Ich habe das nicht getan, weil OP nichts über sie gesagt hat, und ich nahm von seiner vorherigen Frage zu diesem Thema (http://stackoverflow.com/q/28158426/1898580) an, dass diagonale Elemente hier nicht von Interesse sind. –

+1

Aha, wusste nicht, dass es andere verwandte Fragen gab, also ging ich einfach von dem Satz "erstes Vorkommen einer Kombination" ab. –

Verwandte Themen