我有两个字符变量(对象的名称),我想提取最大的公共子字符串.
a <- c('blahABCfoo', 'blahDEFfoo')
b <- c('XXABC-123', 'XXDEF-123')
Run Code Online (Sandbox Code Playgroud)
我想要以下结果:
[1] "ABC" "DEF"
Run Code Online (Sandbox Code Playgroud)
作为输入的这些向量应该给出相同的结果:
a <- c('textABCxx', 'textDEFxx')
b <- c('zzABCblah', 'zzDEFblah')
Run Code Online (Sandbox Code Playgroud)
这些例子具有代表性.字符串包含标识元素,每个向量元素中的其余文本是常见的,但未知.
是否有解决方案,在以下某个地方(按优先顺序):
基地R.
推荐套餐
CRAN上提供的软件包
假设重复的答案不符合这些要求.
如果你不介意使用bioconductor包,那么,你可以使用Rlibstree
.安装非常简单.
source("http://bioconductor.org/biocLite.R")
biocLite("Rlibstree")
Run Code Online (Sandbox Code Playgroud)
然后,你可以这样做:
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"
Run Code Online (Sandbox Code Playgroud)
旁注:我不太确定是否Rlibstree
使用libstree 0.42
或libstree 0.43
.两个库都存在于源包中.我记得在使用的perl中的一个巨大阵列上遇到了内存泄漏(因此出现了错误)libstree 0.42
.只是一个抬头.
这是一个CRAN包:
library(qualV)
sapply(seq_along(a), function(i)
paste(LCS(strsplit(a[i], '')[[1]], strsplit(b[i], '')[[1]])$LCS,
collapse = ""))
Run Code Online (Sandbox Code Playgroud)