序列识别,计数发生和检索序列的一部分

时间:2013-01-03 06:15:49

标签: r

我不认为我想要做的事情真的很难,但是我缺乏做这些事情的适当的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)

这确实有效,但仅适用于模式的一个帐户,它不包括模式发生的所有情况。

我想最终得到的是包含这些信息的内容:

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

2 个答案:

答案 0 :(得分: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] ""

答案 1 :(得分: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"