在两个字符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包含标识元素,而每个向量元素中的其余文本是通用的,但未知。
有没有解决办法,在以下的一个地方(按照优先顺序):
-
基地R
-
推荐软件包
-
在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.42
或libstree 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,这就是为什么我只看第一个列表元素)