2017-08-02 21 views
2

具體來說,我想檢查一列中條目的子字符串是否完全匹配項在另一列,但無子零件不能過長(超過4個字符)在R,如何檢查一個詞條目中的單詞是否與另一條目中的單詞部分匹配

如果我有一個數據幀

df <- data.frame("name"=c("Denzel Washington","Andrew Garfield Junior","Ryan G Gosling"),"check"=c("Denzelboss","Garfield","Goslin")) 

然後我想要的結果是

True, True, False 

首先一個是因爲「Denzel」兩個單詞中的一個是另一個條目的子字符串(並且偏差字符串'boss'不超過4個字符),第二個是因爲三個單詞「Garfield」中的一個被包含在另一個條目中 - 這是完全匹配的,第三個是因爲這三個單詞都不是「檢查」列中條目的子字符串。 (「Gosling」將返回true)

第二列中的所有條目都只有一個單詞。我不想使用模糊匹配算法,因爲條目中的單詞(如Denzel)應該是其他條目「Denzelboss」的確切子字符串,但是當條目爲「DenzelJohnson」時,我也不想返回true 「,偏差」約翰遜「太長。

回答

4

在這裏,我在mapply循環的每一行運行grepl和檢查,以確保在每個子(字符數 - nchar)的長度之差小於4的限制:

df[] <- lapply(df, as.character) 
mapply(
    function(sp,ck) any(sapply(sp, function(x) grepl(x,ck) & (nchar(ck)-nchar(x) <= 4))), 
    strsplit(df$name,"\\s+"), 
    df$check 
) 
#[1] TRUE TRUE FALSE 
0

你的數據幀stringsAsFactors=F

df <- data.frame("name"=c("Denzel Washington","Andrew Garfield Junior","Ryan G 

斯林 「),」 檢查 「= C(」 Denzelboss」, 「加菲貓」, 「戈斯林」),stringsAsFactors = F)

我用iterators::iter遍歷的df行,stringr動詞

Reduce("c", lapply(iter(df,by="row"), function(x) Reduce("any", mapply(function(y,z) ifelse(str_detect(z, y) & nchar(str_replace(z, y, "")) < 5, TRUE, FALSE), as.list(unlist(str_extract_all(x$name, boundary("word")))), x$check)))) 

[1] TRUE TRUE FALSE 
相關問題