在R中,删除字符串中属于其他字符的子字符串的所有字符

时间:2020-09-24 06:13:36

标签: r grepl

这是一个简单的玩具示例。我只想保留最短的子字符串。我们保留的AB和ABC可以排除。我们保留BD和ADB,因为没有朗格字符也具有这种模式。

have <- c('AB', 'BD', 'ADB', 'ABC')
want <- c('AB', 'BD', 'ADB')

grepl在这里非常有用,但我不确定如何提高计算效率。

1 个答案:

答案 0 :(得分:3)

这是基本的R方法:

have <- c('AB', 'BD', 'ADB', 'ABC')
keep <- sapply(have, function(x) grepl(paste0(have[!have %in% x], collapse="|"), x))
want <- have[!keep]
want

[1] "AB"  "BD"  "ADB"

这里的想法是,对于输入向量中的每个条目,构建一个由剩余项组成的正则表达式替换。因此,当sapply达到最终值ABC时,我们形成以下正则表达式替换:

AB|BD|ABD

然后,我们使用grepl查看是否可以找到任何属于ABC子字符串的条目。在这种情况下,我们可以使用AB,然后将其标记为true。最后,我们使用此布尔向量对输入向量进行子集化。