我有需要显示/转换为距离矩阵的成对距离。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
Run Code Online (Sandbox Code Playgroud)
我想转换/显示如下
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
Run Code Online (Sandbox Code Playgroud)
我该怎么办?谢谢
你可以使用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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)