找到两个字符变量之间的共同子(Find common substrings between two

2019-09-01 02:11发布

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

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上可用的软件包

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

Answer 1:

这里有一个CRAN包为:

library(qualV)

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


Answer 2:

如果您在使用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 。 只是抬起头来。



Answer 3:

因为我有太多的事情我不想做,我这样做,而不是:

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只是蛮力家轧功能;输出包含了所有最大的字符串这就是为什么我只能看第一个列表元素)



文章来源: Find common substrings between two character variables
标签: r lcs