14

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

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 回答 3

10

这是一个 CRAN 包:

library(qualV)

sapply(seq_along(a), function(i)
    paste(LCS(strsplit(a[i], '')[[1]], strsplit(b[i], '')[[1]])$LCS,
          collapse = ""))
于 2013-04-24T17:18:39.830 回答
9

如果您不介意使用生物导体封装,那么,您可以使用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"

附带说明:我不太确定Rlibstreeuseslibstree 0.42libstree 0.43. 这两个库都存在于源包中。我记得在perl中使用libstree 0.42. 只是一个抬头。

于 2013-04-24T16:49:28.670 回答
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只是一个蛮力的家庭滚动函数;输出包含所有最大字符串,这就是为什么我只查看第一个列表元素)

于 2013-04-25T18:40:30.250 回答