2013-01-03 21 views
3

我不認爲我想要做的真的很難,但是我缺乏做這些事情的適當的R知識。所以幫助是真正的讚賞!序列識別,計數和檢索序列的一部分

我有含蛋白質的名稱和序列的文件,所以這樣的事情:

Protein1 ABCDEFGHIJKLMNOPQRSTUWXYZ 
Protein2 ABCDEFGHIJKUVMNOPQRSTUVWXYZ 
Protein3 ABCUVDEFGHIJKLMNOPQRSTVVW 

我在尋找包含模式'UU''UV''VV'蛋白質。我這樣做,使用:

編輯:這是一個簡單的例子,目前我看着三胞胎( 「[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) 

這並不工作,但僅限於一個帳戶的模式,它不包括在該模式出現的所有情況。

我想什麼直到結束是包含該信息的內容:

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 

回答

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] "" 
+0

謝謝你的迴應,我可以在明天試試它(抱歉,會議和所有)。同時,當你使用這樣的圖案時,這是否也可以工作:[UV] [UV] [UV],所以UUU,VVV,UUV,UVU等,而不是輸入所有選項? 什麼是最簡單的方式獲得這些結果的某種數據矩陣,我可以導出到txt文件? (向其他人展示) – user1941884

+0

你需要澄清你的意思。當前模式將匹配這四種變體中的任何一種,因爲它們中的每一種都包含UU或UV中的一種。如果你試圖找出三重態重複​​,那麼你需要這麼說(我認爲你提出的模式應該這樣做)。如果你想數它們,你將需要使用'gregexpr'。 –

+0

計數工作完美,謝謝! 不知何故,當我使用總代碼 #In if(!nchar(mat)== nchar(dat [,5])){...: #條件長度> 1並且只有第一個元素將被使用 另外輸出對我來說還不清楚。也許是因爲我使用的文件。我將在週末期間或之後進一步討論,並會回覆給您。我相信我已經接近解決它了。如果我需要一些額外的幫助,將編輯我的帖子。週末愉快! – user1941884

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" 
+0

非常感謝您的回覆,我可以在明天再試一次(對不起,會議等)。它不是一個列表,它是一個數據矩陣。同時,當你使用這樣的圖案時,這是否也可以工作:[UV] [UV] [UV],所以無論是UUU,VVV,UUV,UVU等,而不是輸入所有選項? 什麼是最簡單的方式獲得這些結果的某種數據矩陣,我可以導出到txt文件? (向其他人展示) – user1941884

+0

@ user1941884你會按順序搜索模式嗎?我的意思是你從2個cobns(UV,UU,..)開始,比3個cobin(UUU,VVV,..)等.. – agstudy

+0

我正在尋找三胞胎,從2個氨基酸構建。使用你的代碼我得到了我想要的序列結果,謝謝!儘管不知何故,我最終得到的矩陣很長。當選擇第一列時,我會很好,但這似乎是某處計算時間的浪費。 我會在週末期間或之後再進一步,並會回覆給你。我相信我接近解決所有問題。如果我需要一些額外的幫助,將編輯我的帖子。謝謝你到目前爲止!週末愉快! – user1941884