【问题标题】:Identify a common pattern [duplicate]确定一个共同的模式[重复]
【发布时间】:2016-02-13 14:36:29
【问题描述】:

是否有(容易)识别两个字符串共享的共同模式的可能性? 这里有一个小例子来说明我的意思:

我有两个包含字符串的变量。两者都包括相同的模式(“ABC”)和一些“噪音”。

a <- "xxxxxxxxxxxABCxxxxxxxxxxxx"
b <- "yyyyyyyyyyyyyyyyyyyyyyyABC"

假设我不知道常见模式,我希望 R 找出两个字符串都包含“ABC”。我怎样才能做到这一点?

*编辑

第一个例子可能有点简单。这是我真实数据中的一个例子。

a <- "DUISBURG-HAMBORNS"
b <- "DUISBURG (-31.7.29)S"

两个字符串都包含我希望函数识别的“DUISBURG”。

*编辑

我采用了 cmets 中发布的链接中提出的解决方案。但我仍然没有我想要的。

library(qualV)
LCS(strsplit(a[1], '')[[1]],strsplit(b[1], '')[[1]])$LCS

[1] "D" "U" "I" "S" "B" "U" "R" "G" "-" " " " " "S"

如果函数在寻找两个向量的最长公共子序列,为什么在"D" "U" "I" "S" "B" "U" "R" "G"之后没有停止? .

【问题讨论】:

  • 我们需要更多地了解可能的常见模式和这种“噪音”。例如,“abc”和“cda”是否给出了 2 个常见的模式“a”和“c”?
  • 好的,有一点。我想要至少包含 3 或 4 个元素的模式。

标签: r string lcs


【解决方案1】:

来自qualV 包的函数LCS(在Find common substrings between two character variables 中;不是可能的重复项)执行的操作超出了您的需要。它解决了the longest common subsequence problem,其中子序列不需要占据原始序列中的连续位置。

你拥有的是the longest common substring problem,你可以使用this算法,这里是假设有一个唯一的(就长度而言)最长公共子串的代码:

a <- "WWDUISBURG-HAMBORNS"
b <- "QQQQQQDUISBURG (-31.7.29)S"

A <- strsplit(a, "")[[1]]
B <- strsplit(b, "")[[1]]

L <- matrix(0, length(A), length(B))
ones <- which(outer(A, B, "=="), arr.ind = TRUE)
ones <- ones[order(ones[, 1]), ]
for(i in 1:nrow(ones)) {
  v <- ones[i, , drop = FALSE]
  L[v] <- ifelse(any(v == 1), 1, L[v - 1] + 1)
}
paste0(A[(-max(L) + 1):0 + which(L == max(L), arr.ind = TRUE)[1]], collapse = "")
# [1] "DUISBURG"

【讨论】:

  • 我发现这个功能几乎完美地解决了我遇到的类似问题,尽管我有一个问题。如何让它处理没有 commong 子字符串的情况?具体来说,我不关心确切的子字符串,只关心它的长度,到目前为止,我运行了这个然后使用 nchar,但是当两个字符串没有任何匹配时,该函数返回错误。
  • 我发现在上述情况下ones 是空的,所以它后面的 if 子句解决了它。我遇到的另一个问题是如何将其正确应用于我的数据集?我需要在整个表中逐行比较两列中的字符串。
  • @PrzeM,您始终可以运行for 循环。此外,您可以定义一个函数fun,它将长度为2的向量作为参数(第一个元素是a,第二个元素是b)并执行apply(df, 1, fun)
  • 数据集非常大(几十万行),因此由于性能问题,我宁愿避免循环。我用我的代码和问题的详细信息创建了一个单独的问题:stackoverflow.com/questions/48263456/…
  • @PrzeM,我的评论回答了你的问题;既然您关心效率,我建议您也在那里提及。
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
相关资源
最近更新 更多