3

やりたいことが本当に難しいとは思いませんが、この種のことを行うための適切な R の知識が不足しています。ですから、助けていただければ幸いです。

タンパク質の名前と配列を含むファイルがあるので、次のようになります。

Protein1 ABCDEFGHIJKLMNOPQRSTUWXYZ
Protein2 ABCDEFGHIJKUVMNOPQRSTUVWXYZ
Protein3 ABCUVDEFGHIJKLMNOPQRSTVVW

'UU'パターン、'UV'またはを含むタンパク質を探しています'VV'。私はそれを使用してそれを行いました:

(編集:これは単純化された例です。現在、トリプレット ("[UV][UV][UV]") を見ています)

y <- x[grep("[UV][UV]", x[,2]),]

だから今、私はどれがパターンを持っているかを知っていますが、もっと欲しい. まず、このパターンがシーケンスにどのくらいの頻度で存在するかを知りたいのですが、今のところこれを行う方法を見つけることができませんでした. それでは質問その1です。

質問番号2:パターン+シーケンスの前の部分を抽出したい。これまで私は使用してきました:

pattern <- "[A-Z]{5}[UV][UV]"
locs <- regexpr(pattern, y[,2])
z <- substr(y[,2], locs, locs+attr(locs,"match.length")-1)

これは機能しますが、パターンの 1 つのアカウントについてのみであり、パターンが発生するすべてのケースが含まれているわけではありません。

私が最終的にしたいのは、この情報を含むも​​のです:

Protein name,
number of patterns found in the sequence,
pattern + part of the desired sequence in front

私の例では、結果は次のようになります。

Protein1
0

Protein2
2
GHIJKUV
PQRSTUV

Protein3 
2
ABCUV  #don't know about this one, since the sequence in front is shorter than 5. For me it would be best if these would not appear.
PQRSTVV

編集:最後に、データマトリックスをテキストファイルに保存して、他の人と共有できるようにしたいと思います。次に、次のようなものになりたいと思います。

ProteinName Count Sequence1 Sequence2 Sequence3 SequenceMax
Protein1    0 
Protein2    2     GHIJKUV   PQRSTUV
4

2 に答える 2

3

マッチ数の場合:

> sapply( strsplit(dat[[2]], "UU|UV"), length) -1
[1] 0 2 1

シーケンスを分離するには、どの結果が入力と同じ文字数でないかを確認します。

> sub("(.+)(.{5}UU|.{5}UV)(.+)", "\\2", dat[[2]])
[1] "ABCDEFGHIJKLMNOPQRSTUWXYZ" "PQRSTUV"                   "ABCUVDEFGHIJKLMNOPQRSTVVW"

それらを結合するには:

> apply(dat, 1, function(x) list(count=sapply( strsplit(x[2], "UU|UV"), length) -1 , matches= { mat <- gsub("(.+)(.{5}UU|.{5}UV)(.+)", "\\2", x[2]); if(!nchar(mat) ==nchar(x[2]) ) {mat}else{""} }))
[[1]]
[[1]]$count
V2 
 0 

[[1]]$matches
[1] ""


[[2]]
[[2]]$count
V2 
 2 

[[2]]$matches
       V2 
"PQRSTUV" 


[[3]]
[[3]]$count
V2 
 1 

[[3]]$matches
[1] ""
于 2013-01-03T07:26:20.130 に答える
2

あなたのシーケンスはリストにあると思います

ll <- list('Protein1 ABCDEFGHIJKLMNOPQRSTUWXYZ',
'Protein2 ABCDEFGHIJKUVMNOPQRSTUVWXYZ',
'Protein3 ABCUVDEFGHIJKLMNOPQRSTVVW')

これは機能します:

 sapply(ll, function(x) 
              regmatches(x,gregexpr('[A-Z]{5}UU|[A-Z]{5}UV|[A-Z]{5}VV', x)))


 [[1]]
 character(0)

[[2]]
[1] "GHIJKUV" "PQRSTUV"

[[3]]
[1] "PQRSTVV"

編集:UとVの任意の組み合わせの任意の長さに一致

pattern <- '[A-Z]{5}(U|V)(V|U)+'    ## match pattern begin with U or V
                                    ## followed by at least one U or V

たとえば、データを変更してより長いパターンを挿入します

ll <- list('Protein1 ABCDEFGHIJKLMNOPQRSTUVWXYZ',
           'Protein2 ABCDEFGHIJKUVMNOPQRSTUUVWXYZ',
           'Protein3 ABCUVDEFGHIJUVVKLMNOPQRSTVUUUW')

sapply(ll, function(x)  regmatches(x,gregexpr(pattern, x)))

[[1]]
[1] "PQRSTUV"

[[2]]
[1] "GHIJKUV"  "PQRSTUUV"

[[3]]
[1] "FGHIJUVV"  "PQRSTVUUU"
于 2013-01-03T07:43:15.733 に答える