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

发布于 2024-11-03 21:59:20 字数 1122 浏览 1 评论 0原文

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

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

I got a distance matrix with the following steps:

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)

As such x is a data frame with column and row headers

    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")

The distance matrix d is obtained as follows:

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

By typing str(d), I found it is not a ordinary table nor csv format.

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")

I want to covert the distance matrix to a 3 columns with new headers and save it as a csv file as follows:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

腻橙味 2024-11-10 21:59:20

使用基本 R 函数这是完全可行的。首先,我们希望行的所有成对组合填充结果对象中的 c1c2 列。最后一列 distance 是通过简单地将 "dist" 对象 d 转换为数值向量(它已经是一个向量,但具有不同的向量)来实现的。班级)。

第一步使用 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")

This is quite doable using base R functions. First we want all pairwise combinations of the rows to fill the columns c1 and c2 in the resulting object. The final column distance is achieved by simply converting the "dist" object d into a numeric vector (it already is a vector but of a different class).

The first step is done using combn(rownames(x), 2) and the second step via as.numeric(d):

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

Which gives:

> 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

To save as a CSV file, write.csv(m, file = "filename.csv").

已下线请稍等 2024-11-10 21:59:20

你可以通过组合来自 reshape 包、upper.tri 等的melt来做到这一点:

> 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

you can do this by combining melt from reshape package, upper.tri etc.:

> 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文