通过彼此匹配的前n个字母对字符向量的元素进行分组

时间:2017-12-07 21:27:19

标签: r grep pattern-matching

目标:我想找到一种方法来对字符向量进行分组,如:

x <- c("a800k blue 5", "a800j", "bb-blah5", "a800 7", "bb-blah2", "bb-blah3")

分组与#34;领先比赛&#34;提供最小元素,以便在grep搜索中调用它们。所以上面玩具示例的解决方案是:

solution <- c("a800", "bb-blah")

因为grep使用模式&#34; a800&#34;搜索x将产生以&#34; a800开头的所有3个元素。&#34;

注意:我可以对将包含在向量中的字符串做出很少的假设。只有几个和很长的字符串(可能是10个或更多)之间会有不同的长度,包含数字,字母,空格和一些使生活变得非常困难的特殊字符的组合。

所以我喜欢一个像intersect这样的函数,可能会在每个单独的字符串上运行。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

可能有更优雅(高效)的方式,但这适用于您的示例字符串。对字符串的成对组合(Biobase::lcPrefixC)计算最长公共前缀(combn *)。

source("https://bioconductor.org/biocLite.R")
biocLite("Biobase")

unique(combn(seq_along(x), 2, FUN = function(cm) lcPrefixC(x[cm])))
# [1] "a800"    ""        "bb-blah"

目前还不清楚您是否在前缀长度和组大小之间进行交易。例如:

x <- c("1234", "1235", "1245", "1246")

您是希望一个较大的组具有较短的前缀("12"),还是两个较小的组具有较长的前缀("123""124")?

*“lcPrefixC是C中更快的实现。[但请注意]它只处理ascii字符”。另请参阅lcPrefix