首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将距离矩阵转换并保存为特定格式

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

Stack Overflow用户
提问于 2011-04-28 11:08:44
回答 2查看 21.7K关注 0票数 18

我得到了一个包含以下步骤的距离矩阵:

代码语言:javascript
复制
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是具有列和行头的数据框

代码语言:javascript
复制
    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:

代码语言:javascript
复制
          aaa       bbb       ccc
bbb 1.0000000                    
ccc 0.6666667 0.3333333          
ddd 0.5000000 0.6666667 0.3333333

通过输入str(d),我发现它既不是普通的表,也不是csv格式。

代码语言:javascript
复制
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文件,如下所示:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2011-04-28 15:52:16

使用base R函数可以做到这一点。首先,我们希望行的所有成对组合都填充结果对象中的列c1c2。最后一列distance只需将"dist"对象d转换为数值向量(它已经是一个向量,但属于不同的类)。

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

代码语言:javascript
复制
m <- data.frame(t(combn(rownames(x),2)), as.numeric(d))
names(m) <- c("c1", "c2", "distance")

这就给出了:

代码语言:javascript
复制
> 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")

票数 32
EN

Stack Overflow用户

发布于 2011-04-28 11:47:46

您可以通过组合来自重塑软件包的熔化、upper.tri等来完成此操作:

代码语言:javascript
复制
> 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
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5813156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档