2013-04-24 21 views
10

2つの文字変数(オブジェクトの名前)があり、共通の部分文字列を抽出したい。私は、結果として、次のことをしたい2つの文字変数間の共通部分文字列を見つける

a <- c('blahABCfoo', 'blahDEFfoo') 
b <- c('XXABC-123', 'XXDEF-123') 

a <- c('textABCxx', 'textDEFxx') 
b <- c('zzABCblah', 'zzDEFblah') 

これらの例は、代表的なものである:

[1] "ABC" "DEF" 

これらのベクターの入力としては、同じ結果を与える必要があります。文字列には識別要素が含まれており、各ベクトル要素のテキストの残りは共通ですが、未知です。

  1. ベースR

  2. 推奨パッケージ

  3. パッケージ

  4. CRAN上で利用できる:

    (優先順に)次のいずれかの場所での解決策は、あります

想定複製への回答は、nこれらの要件を満たすことはできません。

+0

この質問をチェックしてください:http://stackoverflow.com/questions/ 1429476/longest-common-substring-problem – dave

+1

これもhttp://finzi.psych.upenn.edu/R/Rhelp02a/archive/68013.html –

+0

http://svitsrv25.epfl.ch/R-doc/library /Biostrings/html/pmatchPattern.html、およびhttp://www.emoticode.net/r/longest-common-substring.html –

答えて

8

ここではそのためのCRANパッケージです:

​​
+1

(+1)です。私はこの関数への入力を見つける*本当に奇妙です。つまり、すべての接尾辞を作成しなければならないことは明らかです。なぜユーザーにそれを依頼するのですか?良い点は、CでLCSを独自に実装していることです。 – Arun

+0

これはパッケージの残りの仕組みと関係があります。ほとんどの処理がベクトルで行われます。 – eddi

+0

ベクトル入力を受け入れる関数は気にしません。しかしそれはちょうど 'LCS(a [i]、b [i])'であるべきです。接尾辞を付けてはいけません。 – Arun

9

バイオコンダクターパッケージの使用を気にしない場合は、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" 

をサイドノートでは:私はRlibstreelibstree 0.42またはlibstree 0.43を使用している場合はかなりよく分かりません。両方のライブラリがソースパッケージに存在します。私はperlの巨大な配列のメモリリーク(したがってエラー)に遭遇したことを覚えています。これはlibstree 0.42を使用していました。ただ頭を上げる。

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は単なるブルートフォースのホームロール関数です;出力にはすべての最大文字列が含まれているため、最初のリスト要素のみを参照します)

関連する問題