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)

这确实有效,但仅针对一种模式,它不包括模式出现的所有情况。

我想最终得到的是包含这些信息的东西:

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 回答