我有两个字符变量(对象名称),我想提取最大的公共子字符串。
a <- c('blahABCfoo', 'blahDEFfoo')
b <- c('XXABC-123', 'XXDEF-123')
我想要以下结果:
[1] "ABC" "DEF"
作为输入的这些向量应该给出相同的结果:
a <- c('textABCxx', 'textDEFxx')
b <- c('zzABCblah', 'zzDEFblah')
这些例子具有代表性。字符串包含标识元素,每个向量元素中的其余文本是常见的,但未知。
是否有解决方案,在以下某个地方(按照优先顺序):
基地R
推荐套餐
CRAN上提供的套餐
假设重复的答案不符合这些要求。
答案 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
只是一个强力的家庭滚动函数;输出包含所有最大字符串,这就是为什么我只看第一个列表元素)