Dex*_*Dex 6 r euclidean-distance
我有一个距离矩阵:
> mat
hydrogen helium lithium beryllium boron
hydrogen 0.000000 2.065564 3.940308 2.647510 2.671674
helium 2.065564 0.000000 2.365661 1.697749 1.319400
lithium 3.940308 2.365661 0.000000 3.188148 2.411567
beryllium 2.647510 1.697749 3.188148 0.000000 2.499369
boron 2.671674 1.319400 2.411567 2.499369 0.000000
Run Code Online (Sandbox Code Playgroud)
和一个数据框:
> results
El1 El2 Score
Helium Hydrogen 92
Boron Helium 61
Boron Lithium 88
Run Code Online (Sandbox Code Playgroud)
我想计算results$El1和中单词之间的所有成对距离results$El2获得以下内容:
> results
El1 El2 Score Dist
Helium Hydrogen 92 2.065564
Boron Helium 61 1.319400
Boron Lithium 88 2.411567
Run Code Online (Sandbox Code Playgroud)
我用for循环做了这个,但看起来真的很笨重.是否有更优雅的方式来搜索和提取更少的代码行?
这是我目前的代码:
names = row.names(mat)
num.results <- dim(results)[1]
El1 = match(results$El1, names)
El2 = match(results$El2, names)
el.dist <- matrix(0, num.results, 1)
for (i1 in c(1:num.results)) {
el.dist[i1, 1] <- mat[El1[i1], El2[i1]]
}
results$Dist = el.dist[,1]
Run Code Online (Sandbox Code Playgroud)
cols <- match(tolower(results$El1), colnames(mat))
rows <- match(tolower(results$El2), colnames(mat))
results$Dist <- mat[cbind(rows, cols)]
results
El1 El2 Score Dist
1 Helium Hydrogen 92 2.065564
2 Boron Helium 61 1.319400
3 Boron Lithium 88 2.411567
Run Code Online (Sandbox Code Playgroud)
您会认出大部分代码。需要重点关注的是mat[cbind(rows, cols)]. 对于矩阵,我们可以用另一个具有相同列数和维度的矩阵进行子集化。来自?`[`帮助:
当通过 [ 索引数组时,单个参数 i 可以是一个矩阵,其列数与 x 的维度一样多;结果是一个向量,其元素对应于 i 的每一行中的索引集。