你可以使用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
也許操縱的'xtabs'輸出?? 'xtabs(DF [,3]〜DF [,1] + DF [,2])' –
@alexis_laz - 這應該是一個答案。 'as.table'中的例子說明:'xtabs()<-> as.data.frame.table()' – thelatemail