2013-06-28 142 views
1

我有這樣的數據集:如何從距離矩陣中提取組內和組間距離?中的R

values<-c(0.002,0.3,0.4,0.005,0.6,0.2,0.001,0.002,0.3,0.01) 
codes<-c("A_1","A_2","A_3","B_1","B_2","B_3","B_4","C_1","C_2","C_3") 
names(values)<-codes 

在代碼中,字母表示的基團和數量各組內的情況下。因此,我有三組,每組有3到4例(實際數據集要大得多,但這是一個子集)。

然後我計算距離矩陣:

dist(values)->dist.m 

現在我想到dist.m轉換數據集中具有兩列:一種含的距離「內部」的所有組(A_1和A_2之間的距離,B_2和B_4之間......等等),另一個包含「組」之間的距離(在A_1和B_1之間,在C_1和B_4之間等等......)

是否有任何簡單的方法可以做到這一點在R?

任何幫助將不勝感激。

非常感謝你提前。

Tina。

回答

2

他們可能稱他們爲矩陣,但他們確實不是。然而,有一個as.matrix功能,可以讓你得到矩陣索引:

> sapply(LETTERS[1:3], function(let) as.matrix(dist.m)[grep(let, codes), grep(let, codes) ] 
+) 
$A 
     A_1 A_2 A_3 
A_1 0.000 0.298 0.398 
A_2 0.298 0.000 0.100 
A_3 0.398 0.100 0.000 

$B 
     B_1 B_2 B_3 B_4 
B_1 0.000 0.595 0.195 0.004 
B_2 0.595 0.000 0.400 0.599 
B_3 0.195 0.400 0.000 0.199 
B_4 0.004 0.599 0.199 0.000 

$C 
     C_1 C_2 C_3 
C_1 0.000 0.298 0.008 
C_2 0.298 0.000 0.290 
C_3 0.008 0.290 0.000 

然後使用負邏輯尋址得到休息:

> as.matrix(dist.m)[grep("A", codes), grep("A", codes) ] 
     A_1 A_2 A_3 
A_1 0.000 0.298 0.398 
A_2 0.298 0.000 0.100 
A_3 0.398 0.100 0.000 

這樣你就可以很緊湊的代碼獲得第一部分:

> sapply(LETTERS[1:3], function(let) as.matrix(dist.m)[grepl(let, codes), !grepl(let, codes) ] 
+) 
$A 
     B_1 B_2 B_3 B_4 C_1 C_2 C_3 
A_1 0.003 0.598 0.198 0.001 0.000 0.298 0.008 
A_2 0.295 0.300 0.100 0.299 0.298 0.000 0.290 
A_3 0.395 0.200 0.200 0.399 0.398 0.100 0.390 

$B 
     A_1 A_2 A_3 C_1 C_2 C_3 
B_1 0.003 0.295 0.395 0.003 0.295 0.005 
B_2 0.598 0.300 0.200 0.598 0.300 0.590 
B_3 0.198 0.100 0.200 0.198 0.100 0.190 
B_4 0.001 0.299 0.399 0.001 0.299 0.009 

$C 
     A_1 A_2 A_3 B_1 B_2 B_3 B_4 
C_1 0.000 0.298 0.398 0.003 0.598 0.198 0.001 
C_2 0.298 0.000 0.100 0.295 0.300 0.100 0.299 
C_3 0.008 0.290 0.390 0.005 0.590 0.190 0.009 

我不認爲這代表爲兩列數據結構的一種方式,但你可以在pkg使用melt :: reshape2拿到三點關口UMN結構:

> melt(as.matrix(dist.m)[grep("A", codes), grep("A", codes) ]) 
    Var1 Var2 value 
1 A_1 A_1 0.000 
2 A_2 A_1 0.298 
3 A_3 A_1 0.398 
4 A_1 A_2 0.298 
5 A_2 A_2 0.000 
6 A_3 A_2 0.100 
7 A_1 A_3 0.398 
8 A_2 A_3 0.100 
9 A_3 A_3 0.000 

這會給你顯示一個相當長的數據幀,但它會很容易把melt函數調用裏面。

+0

工程完美!非常感謝你! – user18441

+0

哦,很好。我擔心你會問我擺脫傳遞重複和零。 –