在两个字符variables之间查找常见的子string

我有两个字符variables(对象的名称),我想提取最大的公共子string。

a <- c('blahABCfoo', 'blahDEFfoo') b <- c('XXABC-123', 'XXDEF-123') 

我想要以下结果:

 [1] "ABC" "DEF" 

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

 a <- c('textABCxx', 'textDEFxx') b <- c('zzABCblah', 'zzDEFblah') 

这些例子具有代表性。 这些string包含标识元素,而每个向量元素中的其余文本是通用的,但未知。

有没有解决办法,在以下的一个地方(按照优先顺序):

  1. 基地R

  2. 推荐软件包

  3. 在CRAN上可用的软件包

假定重复的答案不符合这些要求。

这是一个CRAN包:

 library(qualV) sapply(seq_along(a), function(i) paste(LCS(strsplit(a[i], '')[[1]], strsplit(b[i], '')[[1]])$LCS, collapse = "")) 

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

 source("http://bioconductor.org/biocLite.R") biocLite("Rlibstree") 

那么,你可以做:

 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" 

在旁注:我不太确定Rlibstree使用libstree 0.42libstree 0.43 。 这两个库都存在于源码包中。 我记得在perl中使用libstree 0.42遇到内存泄漏(因此是一个错误)。 只是一个头。

因为我有太多我不想做的事情,所以我做了这个:

 Rgames> for(jj in 1:100) { + str2<-sample(letters,100,rep=TRUE) + str1<-sample(letters,100,rep=TRUE) + longs[jj]<-length(lcstring(str1,str2)[[1]]) + } Rgames> table(longs) longs 2 3 4 59 39 2 

任何人都在意对匹配string的实际分布做一个统计估计? ( lcstring只是一个蛮力的home-rolled函数;输出包含所有的最大string,这就是为什么我只看第一个列表元素)

    Interesting Posts