在 R 中删除字符串中的所有字符,该字符串是其他字符的子字符串
In R remove all characters in string that is substring of other character
这是一个简单的玩具示例。我只想保留最短的子字符串。 AB 我们保留,ABC 可以排除。我们保留 BD 和 ADB 是因为没有 langer 字符也具有这种模式。
have <- c('AB', 'BD', 'ADB', 'ABC')
want <- c('AB', 'BD', 'ADB')
grepl 在这里非常有用,但我不确定如何提高计算效率。
这是一个基本的 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。最后,我们使用这个布尔向量对输入向量进行子集化。
这是一个简单的玩具示例。我只想保留最短的子字符串。 AB 我们保留,ABC 可以排除。我们保留 BD 和 ADB 是因为没有 langer 字符也具有这种模式。
have <- c('AB', 'BD', 'ADB', 'ABC')
want <- c('AB', 'BD', 'ADB')
grepl 在这里非常有用,但我不确定如何提高计算效率。
这是一个基本的 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。最后,我们使用这个布尔向量对输入向量进行子集化。