将距离矩阵转换并保存为特定格式

18

我获得了一个距离矩阵,其中包含以下步骤:

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),我发现它不是普通的表格或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

6
这是比你最近发布的几个问题质量更好的一个问题。有几点需要注意:i)你所称之为“表格”的东西在R中应被称为“数据框”(data frame),而“表格”(table)在R中指的是其他东西。ii)请尽可能回顾一下你的问题,并接受那些你还没有接受过答案的问题的回答。iii)请对用户在你的问题上发表的评论进行回复。这不应该是单向交通,即你提问,我们提供答案。 - Gavin Simpson
2个回答

32
这可以使用基本的R函数轻松完成。首先,我们希望得到所有行的配对组合,以填充结果对象中的列和。通过将“dist”对象转换为数字向量(它已经是一个向量,但是属于不同的类),即可实现最终的列。
第一步使用完成,第二步使用完成:
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
我也对另一种方法很好奇。发现这个人通过reshape提供了一个解决方案:https://dev59.com/1kvSa4cB1Zd3GeqPfIUi - Marco Virgolin
@MarcoVirgolin,查看reshape2包中的acast()函数,这是一种转换为宽格式(即完整距离矩阵)的方法,然后使用as.dist()将该矩阵转换为距离对象。 - Gavin Simpson

24

你可以通过结合reshape包的melt函数和upper.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接