2015-01-27 16 views
5

Bunu gerçekleştiren bir tcrossprod sürümü olabilir, ancak bulamadım. Aşağıdaki örnekte, sipariş önemli değilse, yalnızca bir kombinasyonun ilk oluşumunu içeren satırları nasıl alabilirim? Yani (1,2) benim için (2,1) ile aynıdır.Benzersiz birleşimlerle birlikte tcrossprod

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

bitlik bir kesmek ancak çalışır: 'tt <- tcrossprod (df $ b 1/df $ b); tt [upper.tri (tt)] <- NA; reshape2 :: eriyik (tt, na.rm = T); – user20650

+0

@ user20650 Tablodaki ilk oluşumlar alt üçgen kısma karşılık geliyor, "upper.tri" yerine "lower.tri" kullanılmalı ve Ayrıca bu diyagonal unsurları da istediğimizden argüman 'diag = TRUE' kullanılmalıdır. – tkmckenzie

+0

hi @tkmckenzie; kodu deneyin - doğru sırayı ürettiğini düşünüyorum ve 'diag = TRUE' istemiyoruz, çünkü burası 'NA' – user20650

cevap

4

m <- melt(tcrossprod(df$b,1/df$b)) olması, sadece yapabilirsiniz:

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

Muhtemelen alt kümesi (m, X1> = X2) 'olmalıdır –

+0

Elbette, diyagonal elemanları hesaba katmak gerekirse X1> = X2 olabilir. Bunu yapmadım çünkü OP onlar hakkında bir şey söylemedi ve bu konuyla ilgili önceki sorudan (http://stackoverflow.com/q/28158426/1898580) köşegen öğelerin burada hiçbir ilgisi olmadığını düşündüm. –

+1

Aha, başka ilgili sorular olduğunu bilmiyordu, bu yüzden "bir kombinasyonun ilk oluşumu" ifadesinden çıkmıştım. –