2013-01-03 22 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