2011-04-28 41 views
15

我得到具有以下步驟的距離矩陣:轉換和距離矩陣保存到特定的格式

x <- read.table(textConnection(' 
    t0 t1 t2 
aaa 0 1 0 
bbb 1 0 1 
ccc 1 1 1 
ddd 1 1 0 
'), header=TRUE) 

這樣x與列和行標題

t0 t1 t2 
aaa 0 1 0 
bbb 1 0 1 
ccc 1 1 1 
ddd 1 1 0 

require(vegan) 
d <- vegdist(x, method="jaccard") 

的距離的數據幀矩陣d得到如下:

  aaa  bbb  ccc 
bbb 1.0000000      
ccc 0.6666667 0.3333333   
ddd 0.5000000 0.6666667 0.3333333 

通過鍵入str(d),我發現它不是一個普通的表格e和csv格式。

Class 'dist' atomic [1:6] 1 0.667 0.5 0.333 0.667 ... 
    ..- attr(*, "Size")= int 4 
    ..- attr(*, "Labels")= chr [1:4] "aaa" "bbb" "ccc" "ddd" 
    ..- attr(*, "Diag")= logi FALSE 
    ..- attr(*, "Upper")= logi FALSE 
    ..- attr(*, "method")= chr "jaccard" 
    ..- attr(*, "call")= language vegdist(x = a, method = "jaccard") 

我想距離矩陣隱蔽到3列有新的頭,並將其保存爲CSV文件,如下所示:

c1 c2 distance 
aaa bbb 1.000 
aaa ccc 0.6666667 
aaa ddd 0.5 
bbb ccc 0.3333333 
bbb ddd 0.6666667 
ccc ddd 0.3333333 
+5

這是一個比你最近發佈的幾個質量好得多的Q值。幾點要點:i)你所說的表是R中的一個數據框.R中的表是其他內容。 ii)請儘可能通過問題回覆,並接受您尚未回答的問題。 iii)請回複用戶發佈在您Q上的評論。它不應該是您要求的單向流量,我們提供答案。 – 2011-04-28 08:48:45

回答

18

您可以通過從重塑包,上部結合熔體做到這一點.tri等。:

> library(reshape) 
> m <- as.matrix(d) 
> m 
      aaa  bbb  ccc  ddd 
aaa 0.0000000 1.0000000 0.6666667 0.5000000 
bbb 1.0000000 0.0000000 0.3333333 0.6666667 
ccc 0.6666667 0.3333333 0.0000000 0.3333333 
ddd 0.5000000 0.6666667 0.3333333 0.0000000 
> m2 <- melt(m)[melt(upper.tri(m))$value,] 
> names(m2) <- c("c1", "c2", "distance") 
> m2 
    c1 c2 distance 
5 aaa bbb 1.0000000 
9 aaa ccc 0.6666667 
10 bbb ccc 0.3333333 
13 aaa ddd 0.5000000 
14 bbb ddd 0.6666667 
15 ccc ddd 0.3333333 
26

這是使用基本的R功能相當可行。首先,我們希望行的所有成對組合填充結果對象中的列c1c2。通過簡單地將"dist"對象d轉換成數字向量(它已經是一個向量但是不同類)來實現最後一列distance

的第一步是使用combn(rownames(x), 2)完成,經由as.numeric(d)第二步:

m <- data.frame(t(combn(rownames(x),2)), as.numeric(d)) 
names(m) <- c("c1", "c2", "distance") 

其中給出:

> m 
    c1 c2 distance 
1 aaa bbb 1.0000000 
2 aaa ccc 0.6666667 
3 aaa ddd 0.5000000 
4 bbb ccc 0.3333333 
5 bbb ddd 0.6666667 
6 ccc ddd 0.3333333 

要保存爲CSV文件,write.csv(m, file = "filename.csv")

+1

...以及如何將其轉換回原始類(dist)? – theforestecologist 2016-01-26 06:47:28

+0

我很好奇另一種方式。發現這個人通過重塑提供一個解決方案:http://stackoverflow.com/questions/2126108/convert-table-into-matrix-by-column-names – 2016-07-21 15:05:23

+0

@MarcoVirgolin看包'* reshape2中'acast()'函數*一種方式去寬格式(即全距離矩陣),然後我們as.dist()'將該矩陣轉換爲dist對象。 – 2016-07-21 15:26:40