查找两个字符变量之间的公共子串

Mat*_*erg 12 r lcs

我有两个字符变量(对象的名称),我想提取最大的公共子字符串.

a <- c('blahABCfoo', 'blahDEFfoo')
b <- c('XXABC-123', 'XXDEF-123')
Run Code Online (Sandbox Code Playgroud)

我想要以下结果:

[1] "ABC" "DEF"
Run Code Online (Sandbox Code Playgroud)

作为输入的这些向量应该给出相同的结果:

a <- c('textABCxx', 'textDEFxx')
b <- c('zzABCblah', 'zzDEFblah')
Run Code Online (Sandbox Code Playgroud)

这些例子具有代表性.字符串包含标识元素,每个向量元素中的其余文本是常见的,但未知.

是否有解决方案,在以下某个地方(按优先顺序):

  1. 基地R.

  2. 推荐套餐

  3. CRAN上提供的软件包

假设重复的答案不符合这些要求.

Aru*_*run 9

如果你不介意使用bioconductor包,那么,你可以使用Rlibstree.安装非常简单.

source("http://bioconductor.org/biocLite.R")
biocLite("Rlibstree") 
Run Code Online (Sandbox Code Playgroud)

然后,你可以这样做:

require(Rlibstree)
ll <- list(a,b)
lapply(data.frame(do.call(rbind, ll), stringsAsFactors=FALSE), 
           function(x) getLongestCommonSubstring(x))

# $X1
# [1] "ABC"

# $X2
# [1] "DEF"
Run Code Online (Sandbox Code Playgroud)

旁注:我不太确定是否Rlibstree使用libstree 0.42libstree 0.43.两个库都存在于源包中.我记得在使用的perl中的一个巨大阵列上遇到了内存泄漏(因此出现了错误)libstree 0.42.只是一个抬头.


edd*_*ddi 9

这是一个CRAN包:

library(qualV)

sapply(seq_along(a), function(i)
    paste(LCS(strsplit(a[i], '')[[1]], strsplit(b[i], '')[[1]])$LCS,
          collapse = ""))
Run Code Online (Sandbox Code Playgroud)

  • 另外,我认为用`strsplit(a [i')替换`substring(a [i],seq(1,nchar(a [i])),seq(1,nchar(a [i])))`更容易], '')[[1]]`.起初我只是觉得这更容易阅读.但是[这个网站]建议`strsplit(...)`也更有效** (2认同)