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

时间:2013-04-24 15:41:06

标签: r lcs

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

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

我想要以下结果:

[1] "ABC" "DEF"

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

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

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

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

  1. 基地R

  2. 推荐套餐

  3. CRAN上提供的套餐

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

3 个答案:

答案 0 :(得分:9)

如果您不介意使用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.42还是libstree 0.43。两个库都存在于源包中。我记得在使用libstree 0.42 perl 中的大型数组中遇到内存泄漏(因而出现错误)。只是一个抬头。

答案 1 :(得分:9)

这是一个CRAN包:

library(qualV)

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

答案 2 :(得分:0)

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

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

有人关心对匹配字符串的实际分布进行统计估算吗? (lcstring只是一个强力的家庭滚动函数;输出包含所有最大字符串,这就是为什么我只看第一个列表元素)