2017-10-26 3 views
3

困惑して長い時間と広範な検索をオンラインで試みた後、問題が発生しました。最大の差のために(無作為にはない)文字列をシャッフル

文字列をシャッフルして、元の文字列と同じ最大文字数を持つ文字列を取得する方法を探していますが、同じ文字列が含まれています。私の特定のケースは、短いヌクレオチド配列(4-8ヌクレオチド長)のためである

、これらの例の配列によって表されるように:各シーケンスに対して

seq_1<-"ACTG" 
seq_2<-"ATGTT" 
seq_3<-"ACGTGCT" 

、私は同じが含まれているスクランブル系列を取得したいと思います核酸塩基の数は、異なる順序である。

seq_3の好ましいスクランブルシーケンスは次のようなものです。配列のいずれも1-7位置決めない

seq_3.scramble<-"CATGTGC" 

は、同一の核酸塩基を有するが、全体的な核酸塩基数が(A = 1、C = 2、G = 2、T = 2)と同じです。もちろん、完全に異なる文字列を得ることは必ずしも可能ではありませんが、これらは出力にフラグを立てるだけです。

私は特にシーケンスをランダム化することに興味はなく、これらのスクランブルシーケンスを一貫した方法で作る方法を好むだろう。

ご意見はありますか?

+3

に文字列Aを変換するのに必要な置換の数は、あなたがRを使用する必要があります決定する、stringdist(..., ..., method=hamming)を使用して計算されますか?厳密に距離メトリックを定義できますか?これは基本的には配列の操作と2つのforループです。 –

+2

シーケンスがすべての並べ替えを行うには長すぎる場合は、距離を最大化するためにいくつかのランダムランを試すことができます – user3507085

+0

正確な最適解を探しているのか、また、上記の距離メトリックを定義する必要があります。たとえば、[Levenshtein distance](https://en.wikipedia.org/wiki/Levenshtein_distance)を受け入れることができますか? –

答えて

1

のpython、私はRを知らないが、この試してみる

def calcDistance(originalString,newString): 
    d = 0 
    i=0 
    while i < len(originalString): 
     if originalString[i] != newString[i]: d=d+1 
     i=i+1 


s = "ACTG" 
d_max = 0 
s_final = "" 
for combo in itertools.permutations(s): 
    if calcDistance(s,combo) > d_max: 
      d_max = calcDistance(s,combo) 
      s_final = combo 
+0

答えをくれてありがとう、Mohammad。 ** while **または** for **ループ内の順列を遅くする(私が間違っていると私を修正します)ので、Rにうまく翻訳されるかどうかはわかりません。 –

1

を次のように基本的なソリューションであるため。あなたの基準に合った単一の文字列を返すのではなく、文字列距離のスコアでソートされたすべての文字列のデータフレームを返します。文字列の距離スコアはB.

seq_3<-"ACGTGCT" 

myfun <- function(S) { 
      require(combinat) 
      require(dplyr) 
      require(stringdist) 
      vec <- unlist(strsplit(S, "")) 
      P <- sapply(permn(vec), function(i) paste(i, collapse="")) 
      Dist <- c(stringdist(S, P, method="hamming")) 
      df <- data.frame(seq = P, HD = Dist, fixed=TRUE) %>% 
        distinct(seq, HD) %>% 
        arrange(desc(HD)) 
      return(df) 
     } 

library(combinat) 
library(dplyr) 
library(stringdist) 
head(myfun(seq_3), 10) 

     # seq HD 
# 1 TACGTGC 7 
# 2 TACGCTG 7 
# 3 CACGTTG 7 
# 4 GACGTTC 7 
# 5 CGACTTG 7 
# 6 CGTACTG 7 
# 7 TGCACTG 7 
# 8 GTCACTG 7 
# 9 GACCTTG 7 
# 10 GATCCTG 7 
+0

ありがとう、CPak! これは私にとって完璧に機能します。私は常に特定のソリューションを選択するためのメソッドを追加することができます。 –

関連する問題