2016-03-18 226 views
1

我在比較字符串PRABHAKAR SHARMASHARMA KUMAR PRABHAKAR。目的是檢查更短字符串的所有字符是否存在於另一個字符串中。如果是這樣的話,我應該得到100%的匹配,否則就是表示匹配的字符百分比的百分比。檢查一個字符串中的所有字符是否存在於r中的另一個字符串中

我試過在RecordLinkage包中使用levenshteinSim,但它給出了一個數字,它對應於將一個字符串更改爲另一個字符串所需的更改數。

install.packages("RecordLinkage") 
require(RecordLinkage) 
levenshteinSim("PRABHAKAR SHARMA","SHARMA KUMAR PRABHAKAR") 

#[1] 0.3636364 

我想在這種情況下100%匹配。此外,還必須複製超過1,000,000條記錄。

+0

你的意思是所有_characters_或短字符串的所有_words_需要匹配在更長的字符串? –

+2

如果你正在尋找單詞匹配,你可以嘗試像'long_strings < - 「SHARMA KUMAR PRABHAKAR」; short_strings < - 「PRABHAKAR SHARMA」; mapply(函數(l,s)意味着(s%in%l),strsplit(long_strings,「」),strsplit(short_strings,「」))' –

+0

所有字符..它可能會進一步混亂起來..例如 - 「PRA SHARBHAK ARRMA」和「PRABHAKAR SHARMA KUMAR」.. – Oshan

回答

4

這是一種方法

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)) 
+0

你可以檢查大小寫區分大小寫,非常好:) – TheRimalaya

+0

謝謝Karsten ..這是完美的..你可以請建議一種方法,我可以複製它比較數據幀的兩列? – Oshan

+0

編輯答案以解決列案例。 –

3

如果要考慮的字符只有字母,你可以使用:

comp <- function(s1, s2){   
    in1 = letters %in% strsplit(tolower(s1), "")[[1]] 
    in2 = letters %in% strsplit(tolower(s2), "")[[1]] 
    sum(in1 & in2)/sum(in1) 
} 
相關問題