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

R 将距离矩阵转换并保存为特定格式,r,csv,matrix,distance,R,Csv,Matrix,Distance,我通过以下步骤得到了一个距离矩阵: 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) 距离矩阵d如下所示: aaa bbb ccc bbb 1.0000000 ccc 0.6666667 0.3333333

我通过以下步骤得到了一个距离矩阵:

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)
距离矩阵d如下所示:

          aaa       bbb       ccc
bbb 1.0000000                    
ccc 0.6666667 0.3333333          
ddd 0.5000000 0.6666667 0.3333333
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
通过输入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文件,如下所示:

          aaa       bbb       ccc
bbb 1.0000000                    
ccc 0.6666667 0.3333333          
ddd 0.5000000 0.6666667 0.3333333
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

您可以通过结合重塑包装、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
>库(重塑)
>m m
aaa bbb ccc ddd
aaa 0.0000000 1.0000000 0.66667 0.5000000
bbb 1.0000000.0000000.3333333 0.6666667
ccc 0.66667 0.3333333 0.0000000.3333333
ddd 0.5000000 0.66667 0.3333333 0.0000000
>m2名称(m2)m2
c1-c2距离
5 aaa bbb 1.0000000
9 aaa ccc 0.667
10 bbb ccc 0.3333
13 aaa ddd 0.5000000
14桶ddd 0.667
15 ccc ddd 0.3333333

使用基本R函数是完全可行的。首先,我们希望所有行的成对组合填充结果对象中的列
c1
c2
。最后一列
距离
是通过简单地将
对象
d
转换为数字向量(它已经是一个向量,但属于不同的类)来实现的

第一步使用
combn(行名(x),2)
完成,第二步通过
as.numeric(d)


要另存为CSV文件,
write.CSV(m,file=“filename.CSV”)

这是一个比您最近发布的一些文件质量好得多的Q文件。两点:i)你称之为表的是R中的数据帧。R中的表是其他东西。ii)如果可以,请返回Qs并接受您尚未回答的答案。iii)请回复用户在Qs上发表的评论。你问的不是单向流量,我们提供答案……你如何将其转换回原始类(dist)?我也很好奇另一种方式。发现这个家伙通过重塑提供了一个解决方案:@MarcoVirgolin查看软件包重塑2中的
acast()
函数,找到一种转换为宽格式(即全距离矩阵)的方法,然后使用us
as.dist()
将该矩阵转换为dist对象。
> 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