2013-04-24 55 views
10

我有兩個字符變量(對象的名稱),我想提取最大的公共子字符串。查找兩個字符變量之間的常見子字符

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

假設重複的答案是n不符合這些要求。

+0

看看這個問題:http://stackoverflow.com/questions/ 1429476/longest-common-substring-problem – dave 2013-04-24 15:42:39

+1

此外:http://finzi.psych.upenn.edu/R/Rhelp02a/archive/68013.html – 2013-04-24 15:45:21

+0

http://svitsrv25.epfl.ch/R-doc/library /Biostrings/html/pmatchPattern.html,並且這個http://www.emoticode.net/r/longest-common-substring.html – 2013-04-24 15:46:21

回答

8

這裏有一個CRAN包爲:

​​
+1

(+1)。我發現這個函數的輸入*真的很奇怪。我的意思是,顯然必須創建所有後綴。爲什麼要求用戶這樣做?不錯的是他們有自己的實現LCS在C. – Arun 2013-04-24 17:38:26

+0

它與包的其餘部分如何工作 - 大多數處理是在向量上完成 – eddi 2013-04-24 17:53:57

+0

我不介意使用向量輸入的函數。但它應該是'LCS(a [i],b [i])'就是我的意思。我們不應該生成後綴。 – Arun 2013-04-24 17:56:14

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.42libstree 0.43。這兩個庫都存在於源碼包中。我記得在使用libstree 0.42perl上遇到內存泄漏(並因此出現錯誤)。只是一個頭。

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只是一個蠻力的自制滾動功能;輸出包含所有的最大字符串,這就是爲什麼我只看第一個列表元素)

相關問題