【发布时间】:2021-04-14 20:34:19
【问题描述】:
假设我有以下数据:
example = tibble::tibble(
id = 1:10,
vac = c("FFizer", "sinovasm", "aztraseneca", "phiser", "sonovac",
"faizer", "sinivasc", "astraseneca", "sinocav", "aztraxeneca")
)
看起来像这样:
# A tibble: 10 x 2
id vac
<int> <chr>
1 1 FFizer
2 2 sinovasm
3 3 aztraseneca
4 4 phiser
5 5 sonovac
6 6 faizer
7 7 sinivasc
8 8 astraseneca
9 9 sinocav
10 10 aztraxeneca
我想知道变量 lab 是否在某种程度上与向量中的任何选项匹配。
假设用作标识符的向量是:
labs = c("sinovac", "pfizer", "astrazeneca")
用向量labs 交叉example data.frame 应该会给出如下输出:
correction = tibble::tibble(
id = 1:10,
vac = c("FFizer", "sinovasm", "aztraseneca", "phiser", "sonovac",
"faizer", "sinivasc", "astraseneca", "sinocav", "aztraxeneca"),
match = c("pfizer", "sinovac", "astrazeneca", "pfizer", "sinovac",
"pfizer", "sinovac", "astrazeneca", "sinovac", "astrazeneca")
)
看起来像这样:
# A tibble: 10 x 3
id vac match
<int> <chr> <chr>
1 1 FFizer pfizer
2 2 sinovasm sinovac
3 3 aztraseneca astrazeneca
4 4 phiser pfizer
5 5 sonovac sinovac
6 6 faizer pfizer
7 7 sinivasc sinovac
8 8 astraseneca astrazeneca
9 9 sinocav sinovac
10 10 aztraxeneca astrazeneca
主要思想是找到一种具有齐次vac变量的方法
除此之外,我想创建一个表示“匹配度”的变量。我的意思是,如果字符串是“FFizer”,那么它的匹配将是“pfizer”,它们的匹配度将在 0.66 左右
【问题讨论】:
-
我认为您需要详细说明您的算法。你是怎么得出 0.66 的?你在检查有多少个字符匹配?如果它们被打乱或长度不同怎么办?
-
我没有提供任何关于“匹配度”的更多细节,因为我不清楚匹配的情况。实际上,我说的 0.66 只是计算两个字符串之间共有多少个字符。但主要问题首先是如何将 vac 与实验室向量匹配。
-
@Cristhian 你想使用 Levenshtein 距离。有关选项+研究算法,请参见this question;我认为非常适合您的用例
-
@ctwheels,非常感谢。阅读那篇文章帮助我找到了
stringdist包!