有没有办法根据它们是否作为较长字符串的一部分出现来过滤一组字符串?
Is there a way to filter a set of strings based on whether they appear as part of longer strings?
我知道如何使用 grepl 查看较长字符串列表是否包含较短字符串列表:
short <- c("aa","bb","cc","dd")
long <- c("aabb","abbc","abca")
grepl(paste(short, collapse = '|'), long)
[1] TRUE TRUE FALSE
但是我如何才能确定较短字符串列表是否包含任何较长字符串的 部分?当然,仅将两组 returns 4 FALSE 反转,因为较短的字符串中的 none 包含较长的字符串。在这种情况下,我想要的输出是:
TRUE TRUE FALSE FALSE
R 的新手所以不知道 grepl
是否是这里的正确解决方案。任何帮助表示赞赏。
如果我们调整 max.distance
,则可以使用 agrep
完成部分匹配
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
最简单的方法是遍历您的输入列表:
unlist(lapply(short, function (.) any(grepl(., long, fixed = TRUE))))
(或者,等效地,但具有命名结果:)
vapply(short, function (.) any(grepl(., long, fixed = TRUE)), logical(1L))
我知道如何使用 grepl 查看较长字符串列表是否包含较短字符串列表:
short <- c("aa","bb","cc","dd")
long <- c("aabb","abbc","abca")
grepl(paste(short, collapse = '|'), long)
[1] TRUE TRUE FALSE
但是我如何才能确定较短字符串列表是否包含任何较长字符串的 部分?当然,仅将两组 returns 4 FALSE 反转,因为较短的字符串中的 none 包含较长的字符串。在这种情况下,我想要的输出是:
TRUE TRUE FALSE FALSE
R 的新手所以不知道 grepl
是否是这里的正确解决方案。任何帮助表示赞赏。
如果我们调整 max.distance
agrep
完成部分匹配
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
最简单的方法是遍历您的输入列表:
unlist(lapply(short, function (.) any(grepl(., long, fixed = TRUE))))
(或者,等效地,但具有命名结果:)
vapply(short, function (.) any(grepl(., long, fixed = TRUE)), logical(1L))