如何使用多条染色体计算基因之间的距离

How to calculate distances between genes using multiple chromosomes

我想知道某些基因是否聚集在一起。现在,我已经有了一个基因列表,以及它们的起始和终止位置,而且我已经知道如何计算这些基因之间的距离。问题是我不知道如何考虑染色体的转换。

您无法测量 1 号染色体上的基因与 2 号染色体上的基因之间的距离。

我想这样计算距离:基因2的起始位置-基因1的终止位置。然后,你就有了这些基因之间的距离。

但我该如何解释:当你到达下一条染色体时,R 代码获取了 2 号染色体上基因的起始位置,但获取了 1 号染色体上基因的终止位置,这是不可能的(至少对于我的研究而言)。

所以我想知道如何在 R 中解释这一点。如果基因位于不同的染色体上,我只需要以某种方式跳过这些基因。

希望大家帮帮我

关于下面的代码:三个向量就是起始和终止位置的向量,以及染色体。它们的长度都相等。 chromosomes 是一个向量,包含每个基因的染色体编号

start_vector <- as.vector(sorted_coords$start_position)
end_vector <- as.vector(sorted_coords$end_position)
chromosomes <- as.vector(sorted_coords$chromosome_name)

chromosomes[is.na(chromosomes)] <- 24

count = 0
for(i in 1:length(chromosomes)){
  if(count != chromosomes[i]){
    start <- i - 1
    end <- i + 1

    start_vector <- start_vector[-start]
    end_vector <- end_vector[-end]
    count <- count + 1  
    }

}

我期望所有基因的距离向量,不包括位于不同染色体上的基因的距离。

library(tidyverse) # for all the tidyverse goodies
library(reshape2) # For the melt function

由于您没有提供可重现的示例,我冒昧地制作了自己的玩具数据框,如下所示。它只有2条染色体,但这种方法应该适用于任意数量的染色体和基因。

sorted_coords <- tibble(start_position = abs(rnorm(10)*10),
                        end_position = abs(rnorm(10)*10),
                        chromosome_name = c(rep(1,5),rep(2,5)))

编辑:OP 澄清说他们想先找到基因的距离,而不是其他所有基因的距离。后半部分的方法在最下面,因为我觉得很有趣。新的解决方案在这里:

sorted_coords %>% 
  group_by(chromosome_name) %>%  
  arrange(chromosome_name, start_position) %>% 
  mutate(distance = start_position - lag(end_position, n = 1, default = 0))
  1. 我们按染色体分组,这样我们就不会在染色体之间做任何错误的计算。

  2. 最后我们按照染色体名称排列,方便排序。我们按起始位置排列,这样基因的顺序就正确了。

  3. 我们按照建议计算距离。当前行的起始位置 - 上一行的结束位置。我们指定(虽然这是默认值)我们查看之前的行,如果没有行之前结束位置的值默认为 0。


旧答案

如果您想将每个基因与其他每个基因进行比较,最快的方法是创建一个矩阵。正如您指定的那样,我们想减去基因 1 的开头到基因 2 的结尾。我觉得这不对,但我已经有一段时间没有做生物化学了:)。因为你想要一个单对列表,所以我们可以折叠它(熔化函数)。

下面的代码有点难以理解,让我们分解一下。

sorted_coords %>% 
  group_by(chromosome_name) %>% 
  do( outer(.$start_position, .$end_position) %>% 
        melt() %>% 
        setNames(c("rows", "columns", "distance")))
  1. 我们获取我们的数据框,并根据需要按每个染色体对其进行分组。
  2. do 命令可以让我们进行复杂的操作。 group_by 命令确保我们所做的任何事情对于每条染色体基本上都是独立的。
  3. 外部函数为我们创建了矩阵。 . 是我们传递的数据帧(子集到特定染色体)。我们传递了需要找出差异的两列。
  4. melt 函数将矩阵转换为数据框,以便我们指定它使用哪两个基因来计算差异。它们按数字列出,您可以返回并进行比较。我建议使用 arrange 来设置顺序,以便您可以轻松地引用它。
  5. setNames 只是将列名设置为更可读的名称。

这应该比 运行 所有进程的 for 循环快得多。如果您提供更多信息,我可能会清理更多答案。