我有一个关于在R中找到最长公共子字符串的问题.在StackOverflow上搜索几个帖子时,我了解了qualV包.但是,我看到这个包中的LCS函数实际上找到了string1中存在的所有字符,即使它们不是连续的.
为了解释,如果字符串字符串1:" HEL LO"字符串2:" HEL 12345lo"我希望可以将输出为HEL,但是我得到的输出为hello.我一定做错了什么.请参阅下面的代码.
library(qualV)
a= "hello"
b="hel123l5678o"
sapply(seq_along(a), function(i)
paste(LCS(substring(a[i], seq(1, nchar(a[i])), seq(1, nchar(a[i]))),
substring(b[i], seq(1, nchar(b[i])), seq(1, nchar(b[i]))))$LCS,
collapse = ""))
Run Code Online (Sandbox Code Playgroud)
我也尝试了Rlibstree方法,但我仍然得到不连续的子串.此外,子串的长度也与我的预期不同.请参阅下文.
> a = "hello"
> b = "h1e2l3l4o5"
> ll <- list(a,b)
> lapply(data.frame(do.call(rbind, ll), stringsAsFactors=FALSE), function(x) getLongestCommonSubstring(x))
$do.call.rbind..ll.
[1] "h" "e" "l" "o"
> nchar(lapply(data.frame(do.call(rbind, ll), stringsAsFactors=FALSE), function(x) getLongestCommonSubstring(x)))
do.call.rbind..ll.
21
Run Code Online (Sandbox Code Playgroud) 我有两个字符变量(对象的名称),我想提取最大的公共子字符串.
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上提供的软件包
假设重复的答案不符合这些要求.
是否有(容易)识别两个字符串共有的共同模式的可能性?这里有一个小例子来说明我的意思:
我有两个包含字符串的变量.两者都包括相同的模式("ABC")和一些"噪音".
a <- "xxxxxxxxxxxABCxxxxxxxxxxxx"
b <- "yyyyyyyyyyyyyyyyyyyyyyyABC"
Run Code Online (Sandbox Code Playgroud)
让我说我不知道常见的模式,我希望R找出两个字符串都包含"ABC".我怎样才能做到这一点?
*编辑
第一个例子可能有点简单化.这是我的真实数据的一个例子.
a <- "DUISBURG-HAMBORNS"
b <- "DUISBURG (-31.7.29)S"
Run Code Online (Sandbox Code Playgroud)
两个字符串都包含"DUISBURG",我希望函数能够识别.
*编辑
我在评论中发布的链接中提出了解决方案.但我仍然没有我想要的.
library(qualV)
LCS(strsplit(a[1], '')[[1]],strsplit(b[1], '')[[1]])$LCS
[1] "D" "U" "I" "S" "B" "U" "R" "G" "-" " " " " "S"
Run Code Online (Sandbox Code Playgroud)
如果函数正在寻找两个向量的最长公共子序列,为什么它不会停止"D" "U" "I" "S" "B" "U" "R" "G"?.