2014-11-20 49 views
0

(請隨意將標題更改爲更合適的內容)找到相反的行副本

我想從不對稱方陣中提取所有互惠對。

一些虛擬數據澄清:

m <- matrix(c(NA,0,1,0,0,-1,NA,1,-1,0,1,1,NA,-1,-1,-1,1,0,NA,0,-1,1,0,0,NA), ncol=5, nrow=5) 
colnames(m) <- letters[seq(ncol(m))] 
rownames(m) <- letters[seq(nrow(m))] 

require(reshape2) 
m.m <- melt(m) # get all pairs 
m.m <- m.m[complete.cases(m.m),] # remove NAs 

會怎樣我現在從m.m(從m或直接)提取所有「交互副本」?

這就是我指的是相互重複:

Var1 Var2 value 
    b a 0 
    a b -1 

而且我想{1,1},{-1,-1},{1,0},{-1,0},{0,0}在列表{a,b},{a,c},{a,d},{a,e},{b,c},{b,d},{b,e},{c,d},{c,e},{d,e}指向存儲每個值組合,即其無功組合它,像

$`a,b` 
[1] 0,-1 

我還沒有設法解決這個問題。感覺這可能是merge()inner_join。另外,我對沒有提供最好的例子表示歉意。

任何指針將不勝感激,謝謝。

回答

1

下面是基於所述對象m.m上的方法:

# extract the unique combinations 
levs <- apply(m.m[-3], 1, function(x) paste(sort(x), collapse = ",")) 

# create a list of values for these combinations 
split(m.m$value, levs) 
+0

不錯 - 非常感謝! :) – 2014-11-20 17:21:13

1

使用矩陣表示,則可以使用得到的矩陣(其對齊,你想)的每個三角形的載體:

m[upper.tri(m)] 
t(m)[upper.tri(m)] 

要命名它們:

nm <- matrix(paste("(",rep(rownames(m),times=nrow(m)), ",",rep(rownames(m),each=nrow(m)),")",sep=""), nrow=nrow(m)) 
nm[as.vector(upper.tri(m))] 

最後要轉換爲列表,因爲你w ISH。首先,我把它們放在一個新的2×10矩陣中。然後我用lapply創建列表結構。

pairs<- cbind(m[upper.tri(m)], t(m)[upper.tri(m)]) 
rownames(pairs) <- nm[as.vector(upper.tri(m))] 
pairs 

m.list <- lapply(seq_len(nrow(pairs)),function(i) pairs[i,]) 
names(m.list) <- rownames(pairs) 
m.list 
+0

甜蜜的解決方案!謝謝! :) – 2014-11-20 18:52:19

相關問題