如何从string-distance矩阵提取最佳匹配并生成匹配对数据框?
我来帮你搞定这个从字符串距离矩阵里提取最佳匹配的问题~
首先,你已经用stringdistmatrix生成了距离矩阵,接下来只需要对矩阵做列操作,就能轻松得到你想要的匹配数据框。直接上完整的解决方案代码:
library(stringdist) lookup <- c('Dog', 'Cat', 'Bear') data <- c('Do g', 'Do gg', 'Caat') d.matrix <- stringdistmatrix(a = lookup, b = data, useNames="strings",method="cosine") # 1. 找到每个data元素对应的最小距离在lookup中的位置 match_positions <- apply(d.matrix, 2, which.min) # 2. 根据位置获取对应的匹配项 matchwith <- lookup[match_positions] # 3. 提取每个data元素的最小余弦距离 cosine.s <- apply(d.matrix, 2, min) # 4. 组合成目标格式的数据框 result_df <- data.frame( data = data, matchwith = matchwith, cosine.s = cosine.s, stringsAsFactors = FALSE ) print(result_df)
运行这段代码后,输出完全符合你的需求:
data matchwith cosine.s 1 Do g Dog 0.13387460 2 Do gg Dog 0.12712842 3 Caat Cat 0.05719096
关键步骤解释:
apply(d.matrix, 2, which.min):这里的2表示对矩阵的每一列(对应data里的每个元素)操作,which.min会返回该列中最小值所在的行索引,这个索引正好对应lookup数组里的位置。lookup[match_positions]:用得到的索引从lookup里取出对应的匹配字符串,比如第一个data元素"Do g"对应的最小距离在第1行,所以取lookup[1]也就是"Dog"。apply(d.matrix, 2, min):直接提取每一列的最小值,也就是每个data元素到最佳匹配的余弦距离值。- 最后用
data.frame()把三个向量组合起来,加上stringsAsFactors = FALSE是为了避免字符串被自动转成因子类型(R 4.0+默认已经是这个设置,但写上更保险)。
如果遇到某个data元素和多个lookup元素距离相同的情况,which.min只会返回第一个出现的匹配项。要是你需要保留所有可能的匹配,可以把which.min换成which(d.matrix[, col] == min(d.matrix[, col])),再根据需求处理多匹配的场景。
内容的提问来源于stack exchange,提问作者Phurich.P
相关产品推荐
相关产品推荐

