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()
函数,找到一种转换为宽格式(即全距离矩阵)的方法,然后使用usas.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