在R中将成对距离转换为距离矩阵

4
我有一些成对距离需要显示并转换为距离矩阵。 R应该有相应的函数,但我不确定是哪个函数或如何使用它。我的数据如下所示:
A1  A1  0.90
A1  B1  0.85
A1  C1  0.45
A1  D1  0.96
B1  B1  0.90
B1  C1  0.85
B1  D1  0.56
C1  C1  0.55
C1  D1  0.45
D1  D1  0.90

我希望将其转换/显示为以下内容。
      A1      B1      C1      D1
A1    0.90    0.85    0.45    0.96
B1            0.90    0.85    0.56
C1                    0.55    0.45
D1                            0.90

我该怎么办?谢谢。

4
也许可以操纵?xtabs的输出? xtabs(DF [,3]〜DF [,1] + DF [,2]) - alexis_laz
@alexis_laz - 那应该是一个答案。?as.table 中的示例说明:xtabs() <-> as.data.frame.table() - thelatemail
1个回答

5
您可以使用reshape函数:
df <- read.table(textConnection("
A1  A1  0.90
A1  B1  0.85
A1  C1  0.45
A1  D1  0.96
B1  B1  0.90
B1  C1  0.85
B1  D1  0.56
C1  C1  0.55
C1  D1  0.45
D1  D1  0.90"))

dfr <- reshape(df, direction="wide", idvar="V2", timevar="V1")
dfr
#   V2 V3.A1 V3.B1 V3.C1 V3.D1
# 1 A1  0.90    NA    NA    NA
# 2 B1  0.85  0.90    NA    NA
# 3 C1  0.45  0.85  0.55    NA
# 4 D1  0.96  0.56  0.45   0.9

d <- as.dist(dfr[, -1])
d
#      1    2    3
# 2 0.85          
# 3 0.45 0.85     
# 4 0.96 0.56 0.45

# reset labels
attr(d, "Labels") <- dfr[, 1]
d
#      A1   B1   C1
# B1 0.85          
# C1 0.45 0.85     
# D1 0.96 0.56 0.45

@alexis_laz提到的解决方案似乎更加优雅:

as.dist(xtabs(df[, 3] ~ df[, 2] + df[, 1]))
#      A1   B1   C1
# B1 0.85          
# C1 0.45 0.85     
# D1 0.96 0.56 0.45

但是我怎么才能把标签改回来,而不是1、2、3? - user45270
请看我的编辑。顺便说一句,我真的很喜欢@alexis_laz的解决方案。 - sgibb
是的!xtabs解决方案可行。但我还想要A1、B1、C1和D1的值本身。也就是A1-A1,B1-B1等等。如何在表格中获得这些值? - user45270
@user45270:我不太确定,但我认为dist类不保存对角线的值(因为它们大多是1或0)。顺便问一下,为什么你的对角线值不同于0/1,并且在A1-A1和C1-C1之间也不同呢? - sgibb
嘿,这些值是物种间和同一物种内的DNA序列相似性。在这个属中发生了一些奇怪的事情,或者测序过程中可能出现了技术错误。 - user45270

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