我正在尝试比较PRABHAKAR SHARMA
和SHARMA KUMAR PRABHAKAR
等字符串。目的是检查较短字符串的所有字符是否都存在于另一个字符串中。如果是这种情况,我应该得到100%匹配,否则表示匹配字符百分比的百分比。
我尝试在levenshteinSim
包中使用RecordLinkage
,但它提供的数字对应于将一个字符串更改为另一个字符串所需的更改次数。
install.packages("RecordLinkage")
require(RecordLinkage)
levenshteinSim("PRABHAKAR SHARMA","SHARMA KUMAR PRABHAKAR")
#[1] 0.3636364
我希望在这种情况下100%匹配。此外,还必须复制超过1,000,000条记录。
答案 0 :(得分:5)
这是一种方法
s1 <- "PRABHAKAR SHARMA"
s2 <- "SHARMA KUMAR PRABHAKAR"
compare <- function(s1, s2) {
c1 <- unique(strsplit(s1, "")[[1]])
c2 <- unique(strsplit(s2, "")[[1]])
length(intersect(c1,c2))/length(c1)
}
compare(s1,s2)
#1
但是,它可能有点慢。它也将空间角色视为角色。使用Vectorize
应用于列:
dat <- data.frame(small=c("a", "b"), big=c("aa", "cc"), stringsAsFactors=FALSE)
vcomp <- Vectorize(compare)
dat <- transform(dat, comp=vcomp(small, big))
答案 1 :(得分:3)
如果要考虑的字符只是您可以使用的字母:
comp <- function(s1, s2){
in1 = letters %in% strsplit(tolower(s1), "")[[1]]
in2 = letters %in% strsplit(tolower(s2), "")[[1]]
sum(in1 & in2)/sum(in1)
}