【问题标题】:Grouping elements of a character vector by the first n letters that match each other按相互匹配的前 n 个字母对字符向量的元素进行分组
【发布时间】:2018-05-22 02:13:31
【问题描述】:

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

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

按照“潜在客户匹配”的形式划分为最少元素的组,以便在grep 搜索中调用它们。所以上面玩具示例的解决方案是:

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

因为使用模式“a800”对 x 进行grep 搜索会产生以“a800”开头的所有 3 个元素。

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

所以我想要一个像intersect 这样工作的函数,也许,但在每个单独的字符串上。 有什么想法吗?

【问题讨论】:

标签: r pattern-matching


【解决方案1】:

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

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


【讨论】:

  • 我应该提一下,我受到使用 R 3.2.0 的限制,并且不能使用从那时起编写的大多数包。理想情况下,我会使用基础 R。
  • 好的,我明白了!所以你根本没有设法运行我提出的代码?干杯。
猜你喜欢
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2022-05-22
  • 2011-01-18
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多