[英]Finding the best string match with R
從這個L Hernandez
從包含以下內容的向量:
[1] "HernandezOlaf " "HernandezLuciano " "HernandezAdrian "
我試過這個:
'subset(ABC, str_detect(ABC, "L Hernandez") == TRUE)'
包括首都L anyplace的Hernandez這個名字是理想的輸出。
期望的輸出是HernandezLuciano
可能有幫助:
vec1 <- c("L Hernandez", "HernandezOlaf ","HernandezLuciano ", "HernandezAdrian ")
grep("L ?Hernandez|Hernandez ?L",vec1,value=T)
#[1] "L Hernandez" "HernandezLuciano "
variable <- "L Hernandez"
v1 <- gsub(" ", " ?", variable) #replace space with a space and question mark
v2 <- gsub("([[:alpha:]]+) ([[:alpha:]]+)", "\\2 ?\\1", variable) #reverse the order of words in the string and add question mark
您還可以使用strsplit
將variable
拆分為@rawr注釋
grep(paste(v1,v2, sep="|"), vec1,value=T)
#[1] "L Hernandez" "HernandezLuciano "
您可以使用agrep
函數進行近似字符串匹配。 如果您只是運行此函數,它匹配每個字符串...
agrep("L Hernandez", c("HernandezOlaf ", "HernandezLuciano ", "HernandezAdrian "))
[1] 1 2 3
但如果你修改一點“L Hernandez” - >“Hernandez L”
agrep("Hernandez L", c("HernandezOlaf ", "HernandezLuciano ", "HernandezAdrian "))
[1] 1 2 3
並改變最大距離
agrep("Hernandez L", c("HernandezOlaf ", "HernandezLuciano ", "HernandezAdrian "),0.01)
[1] 2
你得到了正確的答案。 這只是一個想法,它可能適合你:)
如果您只想在大寫字母L之后需要全名,則可以修改以下內容:
vec1[grepl("Hernandez", vec1) & grepl("L\\.*", vec1)]
[1] "L Hernandez" "HernandezLuciano
要么
vec1[grepl("Hernandez", vec1) & grepl("L[[:alpha:]]", vec1)]
[1] "HernandezLuciano "
該表達式在“Hernandez”上查找匹配,然后查看是否有大寫字母“L”后跟任何字符或空格。 第二個版本需要在大寫字母“L”之后寫一封信。
順便說一句,看起來你不能把這些傻瓜連在一起。
vec1[grepl("Hernandez", vec1) & grepl("L\\[[:alpha:]]", vec1)]
character(0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.