2014-03-18 72 views
0

我有成对的距离,我需要显示/转换成距离矩阵。 R应该有一个功能,但我不知道哪一个或如何使用相同。我的数据看起来像下面将成对距离转换成距离矩阵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 

我应该怎么办?由于

+3

也许操纵的'xtabs'输出?? 'xtabs(DF [,3]〜DF [,1] + DF [,2])' –

+0

@alexis_laz - 这应该是一个答案。 'as.table'中的例子说明:'xtabs()<-> as.data.frame.table()' – thelatemail

回答

2

你可以使用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 
+0

但是,如何获取标签而不是1,2,3? – user45270

+0

请参阅我的编辑。顺便说一句,我真的很喜欢@alexis_laz的解决方案。 – sgibb

+0

是的! xtabs解决方案起作用。但我也想要A1,B1,C1和D1值。那就是A1-A1,B1-B1等等。我如何获得这些表格? – user45270