【问题标题】:Finding A-U, C-G and G-U pair proporstion in a sequence in R在 R 中的序列中找到 A-U、C-G 和 G-U 对比例
【发布时间】:2018-09-24 22:28:55
【问题描述】:

我一直在徘徊这个程序问题,但我还没有得到一个明确的答案......

我有两个对象,比如说 a 和 b。对象a是一个字符串,代表一个RNA序列,像这样:

> a
[1] "C" "A" "C" "C" "U" "U" "G" "U" "C" "C" "U" "C" "A" "C" "G" "G" "U" "C" "C" "A" "G" "U" "U" "U" "U" "C" "C" "C" "A" "G"
[31] "G" "A" "A" "U" "C" "C" "C" "U" "U" "A" "G" "A" "U" "G" "C" "U" "G" "A" "G" "A" "U" "G" "G" "G" "G" "A" "U" "U" "C" "C"
[61] "U" "G" "G" "A" "A" "A" "U" "A" "C" "U" "G" "U" "U" "C" "U" "U" "G" "A" "G" "G" "U" "C" "A" "U" "G" "G"

而对象b是另一个字符串,表示一个折叠结构,其中“(”符号表示a中的一个字母,与另一个相同序列的字母配对,表示为“)”。符号“。”表示这个字母没有配对。

对象 b 如下所示:

> b
[1] "." "." "(" "(" "." "(" "(" "." "(" "(" "(" "(" "(" "." "(" "(" "." "." "(" "(" "(" "(" "." "(" "(" "." "(" "(" "(" "("
[31] "(" "(" "(" "(" "(" "(" "(" "(" "." "." "." "." "." "." "." "." "." "." "." "." "." ")" ")" ")" ")" ")" ")" ")" ")" ")"
[61] ")" ")" ")" "." ")" ")" "." ")" ")" ")" ")" "." "." ")" ")" ")" ")" ")" ")" ")" "." ")" ")" "." ")" ")"

如果你计算每个对象a和b中的字符数,它们是相同的,也就是说b中的第一个字符对应a中的第一个字符,依此类推。说,在这种情况下,a[1] 是“C”,对应于 b[1],即“.”,表示序列中的这个字母不是成对的,但是当我们到达 b[3] 时,它是“(”,a 中的第一个配对字母,对应于 a[3] 或“C”。第一个“(”在 b 中,配对字母“C”,在 a 中,连接到最后一个“)”符号b,对应b[86],因此对应a[86],即“G”。

b 中的第一个“(”与 b 中的最后一个“)”形成一对,依此类推。

如您所见,我的目标是确定序列中有多少个 A-U、C-G 和 G-U 对。

我在那里有信息,但我想不出 R 中的编程方法(我正在构建我的算法以从这两个对象中提取其他特征)来处理这个问题。

我曾想过提取每个“(”和每个“)”的索引号,并用它在a中找到对应的字母,然后将a[3]和a[86]等组合起来,以形成另一个对象。

所需的输出类似于构造一个由对组合组成的对象,例如 c:

> c
[1] "CG" "CG" "UA" "GC" "CG" "CG" "UA" "CG" "AU" "GU" "GC"....

这样我就可以算出有多少个CG、GC和加起来,有多少个AU、UA加起来,有多少GU或UG加起来,从而得到AU、GC和GU是多少在序列中。

有什么帮助吗?

【问题讨论】:

标签: r string indexing structure


【解决方案1】:

当所有“(”都在第一个“)”之前,那么您可以简单地提取两个子向量,将第二个反转并组合它们:

data.frame(pair1 = a[b == "("], pair2 = rev(a[b == ")"]))

你也可以使用

mapply(paste0, a[b == "("], rev(a[b == ")"]))

如果您实际上正在寻找具有多个循环的通用解决方案,您可以将stackfor 循环结合使用:

library(dequer)
s <- stack()
q <- queue()
for (i in seq_along(a)) {
    if(b[i] == "(")
        push(s, a[i])
    else if(b[i] == ")") 
        pushback(q, paste0(pop(s), a[i]))
}
unlist(as.list(q))

【讨论】:

  • 这种方法会给出错误的结果,因为 RNA 结构可以有多个环。因此,例如,((.))..(.). 是一个有效的结构。你真的不会使用 CFG。
  • @KonradRudolph OP 似乎正在寻找一种特殊情况的解决方案,因为他说第一个“(”与最后一个“)”形成一对。这符合样本数据。对于一般情况,您可以在输入向量上使用堆栈和循环。
猜你喜欢
  • 2015-02-06
  • 2019-01-07
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2012-10-15
  • 2013-08-30
相关资源
最近更新 更多