我想找出某些基因是否聚集在一起。现在,我已经有了一个基因列表,以及它们的起始和终止位置,而且我已经知道如何计算这些基因之间的距离。问题是我不知道如何考虑染色体的转换。
您无法测量1号染色体上的基因与2号染色体上的基因之间的距离。
我想到了这样计算距离:基因2的起始位置-基因1的终止位置。然后,您具有这些基因之间的距离。
但是我该怎么解释:当您到达下一个染色体时,R代码会抓住一个基因在2号染色体上的起始位置,但是会抓住一个基因在1号染色体上的终止位置,这是不可能的(对于我的研究,至少)。
所以我想知道如何在R中解释。如果它们位于不同的染色体上,我只需要以某种方式跳过它们。
我希望你们能帮助我。
关于以下代码:三个向量只是起始位置和终止位置的向量,以及染色体。它们的长度相等。 染色体是一个包含每个基因的染色体编号的载体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
}
}
我希望所有基因的距离都是一个向量,不包括位于不同染色体上的基因的距离。
答案 0 :(得分:2)
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")))
.
是我们传递的数据帧(属于特定染色体)。我们通过两列我们需要找出两者的区别。这应该比为所有进程运行for循环要快得多。如果您提供更多信息,我可能会进一步清理答案。