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