如何使用多条染色体计算基因之间的距离
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))
我们按染色体分组,这样我们就不会在染色体之间做任何错误的计算。
最后我们按照染色体名称排列,方便排序。我们按起始位置排列,这样基因的顺序就正确了。
我们按照建议计算距离。当前行的起始位置 - 上一行的结束位置。我们指定(虽然这是默认值)我们查看之前的行,如果没有行之前结束位置的值默认为 0。
旧答案
如果您想将每个基因与其他每个基因进行比较,最快的方法是创建一个矩阵。正如您指定的那样,我们想减去基因 1 的开头到基因 2 的结尾。我觉得这不对,但我已经有一段时间没有做生物化学了:)。因为你想要一个单对列表,所以我们可以折叠它(熔化函数)。
下面的代码有点难以理解,让我们分解一下。
sorted_coords %>%
group_by(chromosome_name) %>%
do( outer(.$start_position, .$end_position) %>%
melt() %>%
setNames(c("rows", "columns", "distance")))
- 我们获取我们的数据框,并根据需要按每个染色体对其进行分组。
- do 命令可以让我们进行复杂的操作。 group_by 命令确保我们所做的任何事情对于每条染色体基本上都是独立的。
- 外部函数为我们创建了矩阵。
.
是我们传递的数据帧(子集到特定染色体)。我们传递了需要找出差异的两列。
- melt 函数将矩阵转换为数据框,以便我们指定它使用哪两个基因来计算差异。它们按数字列出,您可以返回并进行比较。我建议使用 arrange 来设置顺序,以便您可以轻松地引用它。
- setNames 只是将列名设置为更可读的名称。
这应该比 运行 所有进程的 for 循环快得多。如果您提供更多信息,我可能会清理更多答案。
我想知道某些基因是否聚集在一起。现在,我已经有了一个基因列表,以及它们的起始和终止位置,而且我已经知道如何计算这些基因之间的距离。问题是我不知道如何考虑染色体的转换。
您无法测量 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))
我们按染色体分组,这样我们就不会在染色体之间做任何错误的计算。
最后我们按照染色体名称排列,方便排序。我们按起始位置排列,这样基因的顺序就正确了。
我们按照建议计算距离。当前行的起始位置 - 上一行的结束位置。我们指定(虽然这是默认值)我们查看之前的行,如果没有行之前结束位置的值默认为 0。
旧答案
如果您想将每个基因与其他每个基因进行比较,最快的方法是创建一个矩阵。正如您指定的那样,我们想减去基因 1 的开头到基因 2 的结尾。我觉得这不对,但我已经有一段时间没有做生物化学了:)。因为你想要一个单对列表,所以我们可以折叠它(熔化函数)。
下面的代码有点难以理解,让我们分解一下。
sorted_coords %>%
group_by(chromosome_name) %>%
do( outer(.$start_position, .$end_position) %>%
melt() %>%
setNames(c("rows", "columns", "distance")))
- 我们获取我们的数据框,并根据需要按每个染色体对其进行分组。
- do 命令可以让我们进行复杂的操作。 group_by 命令确保我们所做的任何事情对于每条染色体基本上都是独立的。
- 外部函数为我们创建了矩阵。
.
是我们传递的数据帧(子集到特定染色体)。我们传递了需要找出差异的两列。 - melt 函数将矩阵转换为数据框,以便我们指定它使用哪两个基因来计算差异。它们按数字列出,您可以返回并进行比较。我建议使用 arrange 来设置顺序,以便您可以轻松地引用它。
- setNames 只是将列名设置为更可读的名称。
这应该比 运行 所有进程的 for 循环快得多。如果您提供更多信息,我可能会清理更多答案。