2016-09-07 6 views
0

文字列を指定すると、文字列内で起こりうる各部分文字列を計算します。私は以下のように機能を書かれている可能なすべての部分文字列の出現数とその出現をカウントします。

"A" = 2 
"B" = 2 
"AA" = 0 
"AB" = 2 
"BA" = 1 
"BB" = 0 

:たとえば、私はすべての可能な部分列とそれらの値を計算したい文字列

str = "abab" 

を与え

countSubstrings <- function(string_try ="", items = NULL) 
{ 
    string_try <- toupper(string_try) 

    if(is.null(items)) 
    { 
    items <- strsplit(string_try, "")[[1]] 
    } 

    n <- length(unique(items)) 

    counts_substrings <- c() 
    substrings_all <- c() 

    for (i in 1:n) # Number of characters in substring 
    { 
    substrings_combo <- gtools::permutations(n, i, unique(items), repeats=TRUE) 

    print(paste("The number of combinations is: ", 
      nrow(substrings_combo), "for substrings of length", i)) 

    for(j in 1:nrow(substrings_combo)) 
    { 
     tosearch <- paste(substrings_combo[j,], collapse = "") 

     substrings_all <- c(substrings_all, tosearch) 

     total <- sum(grepl(tosearch, 
       sapply(1:(nchar(string_try) - 1), 
         function(ii) substr(string_try, ii, ii + 1)))) 

     counts_substrings <- c(counts_substrings, find_overlaps(tosearch, string_try)) 

    } 
    } 

    return(list(substrings_all,counts_substrings)) 
} 

それは何をしてIほんとうに遅いです。 1つの潜在的な欠陥私のプログラムでは、 "aa"の発生がゼロであっても部分文字列 "aaa"とみなしています。これは、シーケンス解析とパターンマイニングで一般的です。私はすでに高速化された実装が既にあるのか、それとも何とか最適化できるのかどうか疑問です。 Rソリューションが必要です。

答えて

2

すべての連続した部分文字列ですか?あなたの例には、部分文字列ではない値のある0があります。

について方法:

は、抽出関数これは1、2、3、...、Nサブストリング

の任意のグループを抽出することができる n

allsubstr <- function(x, n) substring(x, 1:(nchar(x) - n + 1), n:nchar(x)) 

長さの(not just unique)サブストリングを作成します

allsubstr("abab", 1) 
#> [1] "a" "b" "a" "b" 
allsubstr("abab", 2) 
#> [1] "ab" "ba" "ab" 
allsubstr("abab", 3) 
#> [1] "aba" "bab" 
allsubstr("abab", 4) 
#> [1] "abab" 

これは、所望の文字列の長さまで1に対して反復することができ、発生のテーブルは

substrings_table <- function(string) table(unlist(sapply(1:nchar(string), allsubstr, x=string))) 

substrings_table("abab") 
#> a ab aba abab b ba bab 
#> 2 2 1 1 2 1 1 

文字の潜在的な組み合わせをすべて含めることは、これを拡張する可能性があり、このテーブルに対して組み合わせのリストを確認する必要があります。私はこれらのタイプの操作のためのquantedaパッケージは非常に便利

2

library(quanteda) 
x <- "abab" 

ngrams(strsplit(x, '')[[1]], n = 2, concatenator = '') 
#[1] "ab" "ba" "ab" 

#or 
table(ngrams(strsplit(x, '')[[1]], n = 2, concatenator = '')) 
#ab ba 
# 2 1 

#or to get all combinations, 
unlist(sapply(1:nchar(x), function(i)table(ngrams(strsplit(x, '')[[1]], n = i, concatenator = '')))) 
#a b ab ba aba bab abab 
#2 2 2 1 1 1 1 
関連する問題