Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R_R_Algorithm - Fatal编程技术网

在R

在R,r,algorithm,R,Algorithm,我在寻找一个在R中找到CpG岛的算法。我还没有找到一个特别的,所以我决定自己做一个。所讨论的算法来自Gardiner garden和Frommer的一篇文章(任何谷歌搜索都可以找到这篇文章供阅读),主要规则如下: CpG岛定义为至少200 bp的区域 “GC含量”或GC二核苷酸的比例大于50% 观察到的CpG比(O/E)大于0.6。这通过以下公式计算: Obs/Exp CpG=CpG数量*N/(C数量*G数量) N为所考虑片段中的核苷酸数 我对这个想法没有深入了解,因为我缺乏编程方面的知识,但我

我在寻找一个在R中找到CpG岛的算法。我还没有找到一个特别的,所以我决定自己做一个。所讨论的算法来自Gardiner garden和Frommer的一篇文章(任何谷歌搜索都可以找到这篇文章供阅读),主要规则如下:

  • CpG岛定义为至少200 bp的区域
  • “GC含量”或GC二核苷酸的比例大于50%
  • 观察到的CpG比(O/E)大于0.6。这通过以下公式计算:

    Obs/Exp CpG=CpG数量*N/(C数量*G数量)

  • N为所考虑片段中的核苷酸数

    我对这个想法没有深入了解,因为我缺乏编程方面的知识,但我找到了这个算法的步骤以及它应该如何工作:

  • 确定了基因组序列中每个“CG”的位置,以及前一个“CG”以来的核苷酸数量以及C和G的数量

  • 核苷酸的总数可以让我们计算出一个分子的长度 假设岛,C和G计数让我们计算GC%和 O/E分数

  • 根据以下规则建立可能属于某个岛屿的连续CPG阵列:

  • a.
    我们从基因组中的第一个CpG开始,然后将随后的CpG添加到 一个接一个地移动阵列(向前滑动右边缘)

    b.
    每次我们在右侧添加一个CpG时:

    1b)
    如果长度小于200,我们继续(在右侧添加另一个)。 否则,长度标准得到满足,我们将评估%GC和O/E

    2b)
    如果这三个标准都满足,我们会注意到我们假定的岛屿看起来不错,并继续前进(尝试建造一个更大的岛屿)。如果在我们添加此CpG之前满足所有三个标准,但现在不再满足%GC和O/E,我们将此CpG用作新假定孤岛的开始,并打印出上一次迭代中的孤岛

    3b)

    4b)

    可以找到一个样本序列

    我迄今为止的努力:

    a=lapply(x, function(vec){
      x <- gregexpr("gc", vec, perl = TRUE)
      res <- sum(attr(x[[1]], "match.length"))
      res
    })
    
    
    b=lapply(x, function(vec){
      x <- gregexpr("g", vec, perl = TRUE)
      res <- regmatches(vec, x)
      res
    }) 
    
    
    c=lapply(x, function(vec){
      x <- gregexpr("c", vec, perl = TRUE)
      res <- regmatches(vec, x)
      res
    }) 
    
    因此,更容易处理一个大序列

    如果有人能帮忙,我将非常感激

    编辑1:

    在仔细查看之后,我发现上述算法步骤实际上是一种称为滑动窗口算法的算法。在这里,我在Stackoverflow上找到了许多R的滑动窗口算法示例。如果做了一些更改,这可能就是该算法的解决方案。代码如下:

    slide_function <- function(data, window, step){
      total <- length(data)
      spots <- seq(from=1, to=(total-window), by=step)
      result <- vector(length = length(spots))
      for(i in 1:length(spots)){
    
        result[i] <- 
    
      }
      return(result)
    }
    
    slide\u函数
    
    slide_function <- function(data, window, step){
      total <- length(data)
      spots <- seq(from=1, to=(total-window), by=step)
      result <- vector(length = length(spots))
      for(i in 1:length(spots)){
    
        result[i] <- 
    
      }
      return(result)
    }