具体来说,我想检查一列中条目的子字符串是否与另一列中条目中的一个单词完全匹配,但非子字符串部分不能太长(超过四个字符) )
如果我有数据框
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,“包含在另一个条目中 - 它是完全匹配,第三个是因为三个单词中没有一个是'check'列中条目的子字符串。 (“Gosling”会回归真实)
第二列中的所有条目只有一个单词。我不想使用模糊匹配算法,因为条目中的单词(如Denzel)应该是另一个条目“Denzelboss”的精确子字符串,但当条目为“DenzelJohnson”时我也不想返回true “,偏差”约翰逊“太长了。
答案 0 :(得分:4)
这里我在grepl
循环中为每一行运行mapply
并检查以确保每个子字符串长度的差异(字符数 - 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
答案 1 :(得分: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