使用 R 匹配字符串
Matching strings using R
我有一个一般性问题。我尝试在 R 中的数据帧之间进行字符串匹配。我的字符串格式如下:
"COOL FOODS LTD 222 HIGH ST LONDON ABC123"
我想遍历其他数据框,并希望我的代码在上面的字符串和下面的字符串之间找到匹配项:
"222 HIGH ST LONDON ABC123 COOL FOODS LTD "
"HIGH LTD ST 222 LONDON COOL ABC123 FOODS "
"COOL FOODS LTD 222 HIGH ST LONDON UNITED KINGDOM ABC123"
我尝试了 adist
,但是当字符串的某些部分被重新排列或插入的部分很长时(根据示例),我使用该方法获得的相似度分数不是很好。
我想过用空格分割我的字符串,但我不确定如何与许多数据帧进行有效的匹配和比较。
如有任何建议,我将不胜感激!
干杯!
使用包 stringdist
,您可以编写一个辅助函数,将字符串与向量中的每个目标字符串进行比较。
下面的函数首先是strplit
和sort
的所有字符串。然后调用 stringsim
计算相似度分数。
funSimilarity <- function(x, y, method = "osa"){
x <- strsplit(x, " ")[[1]]
x <- paste(sort(x), collapse = " ")
y_list <- strsplit(y, " ")
y_list <- lapply(y_list, function(.y) paste(sort(.y), collapse = " "))
stringsim(x, unlist(y_list), method = method)
}
funSimilarity(x, y)
#[1] 1.0000000 1.0000000 0.7272727
met <- c("osa", "lv", "dl", "hamming", "lcs", "qgram",
"cosine", "jaccard", "jw", "soundex")
sapply(met, function(m) funSimilarity(x, y, method = m))
# osa lv dl hamming lcs qgram cosine
#[1,] 1.0000000 1.0000000 1.0000000 1 1.0000000 1.0000000 1.0000000
#[2,] 1.0000000 1.0000000 1.0000000 1 1.0000000 1.0000000 1.0000000
#[3,] 0.7272727 0.7272727 0.7272727 0 0.8421053 0.8421053 0.9689541
# jaccard jw soundex
#[1,] 1.0000000 1.0000000 1
#[2,] 1.0000000 1.0000000 1
#[3,] 0.8095238 0.8632576 1
我有一个一般性问题。我尝试在 R 中的数据帧之间进行字符串匹配。我的字符串格式如下:
"COOL FOODS LTD 222 HIGH ST LONDON ABC123"
我想遍历其他数据框,并希望我的代码在上面的字符串和下面的字符串之间找到匹配项:
"222 HIGH ST LONDON ABC123 COOL FOODS LTD "
"HIGH LTD ST 222 LONDON COOL ABC123 FOODS "
"COOL FOODS LTD 222 HIGH ST LONDON UNITED KINGDOM ABC123"
我尝试了 adist
,但是当字符串的某些部分被重新排列或插入的部分很长时(根据示例),我使用该方法获得的相似度分数不是很好。
我想过用空格分割我的字符串,但我不确定如何与许多数据帧进行有效的匹配和比较。
如有任何建议,我将不胜感激!
干杯!
使用包 stringdist
,您可以编写一个辅助函数,将字符串与向量中的每个目标字符串进行比较。
下面的函数首先是strplit
和sort
的所有字符串。然后调用 stringsim
计算相似度分数。
funSimilarity <- function(x, y, method = "osa"){
x <- strsplit(x, " ")[[1]]
x <- paste(sort(x), collapse = " ")
y_list <- strsplit(y, " ")
y_list <- lapply(y_list, function(.y) paste(sort(.y), collapse = " "))
stringsim(x, unlist(y_list), method = method)
}
funSimilarity(x, y)
#[1] 1.0000000 1.0000000 0.7272727
met <- c("osa", "lv", "dl", "hamming", "lcs", "qgram",
"cosine", "jaccard", "jw", "soundex")
sapply(met, function(m) funSimilarity(x, y, method = m))
# osa lv dl hamming lcs qgram cosine
#[1,] 1.0000000 1.0000000 1.0000000 1 1.0000000 1.0000000 1.0000000
#[2,] 1.0000000 1.0000000 1.0000000 1 1.0000000 1.0000000 1.0000000
#[3,] 0.7272727 0.7272727 0.7272727 0 0.8421053 0.8421053 0.9689541
# jaccard jw soundex
#[1,] 1.0000000 1.0000000 1
#[2,] 1.0000000 1.0000000 1
#[3,] 0.8095238 0.8632576 1