我知道如何使用grepl查看较长字符串列表是否包含较短字符串列表:
["Harry Potter" , "Hunger Games", "The Great Gatsby", "Frankenstein"];
但是我如何找出较短字符串列表中是否包含任何较长字符串的 part ?当然,仅反转两个集合将返回4 FALSE,因为较短的字符串都不包含较长的字符串。在这种情况下,我想要的输出将是:
short <- c("aa","bb","cc","dd")
long <- c("aabb","abbc","abca")
grepl(paste(short, collapse = '|'), long)
[1] TRUE TRUE FALSE
对R较新,所以不知道TRUE TRUE FALSE FALSE
是否是此处的正确解决方案。任何帮助表示赞赏。
答案 0 :(得分:1)
最简单的方法是遍历输入列表:
unlist(lapply(short, function (.) any(grepl(., long, fixed = TRUE))))
(或等效地,但具有命名结果:)
vapply(short, function (.) any(grepl(., long, fixed = TRUE)), logical(1L))
答案 1 :(得分:0)
如果我们调整agrep
max.distance
进行部分匹配
Reduce(`|`, lapply(long, function(x) agrepl(x, short, max.distance = 0.3)))
#[1] TRUE TRUE FALSE FALSE
如果这是固定比赛,我们可以做
lengths(lapply(short, function(x) regmatches(long, regexpr(x, long)))) > 0
#[1] TRUE TRUE FALSE FALSE