我想知道某些基因是否聚集在一起。现在,我已经有了一个基因列表,以及它们的起始和停止位置,我已经知道如何计算这些基因之间的距离。问题是我不知道如何考虑染色体的转换。
你不能测量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
}
}
我期待一个所有基因的距离向量,不包括位于不同染色体上的基因的距离。
发布于 2019-01-09 19:15:57
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的末尾,这对我来说并不合适,但我已经有一段时间没有做过biochem了:)。因为您想要一个单对列表,所以我们可以折叠它(熔体函数)。
下面的代码有点模糊,所以让我们把它分解一下。
sorted_coords %>%
group_by(chromosome_name) %>%
do( outer(.$start_position, .$end_position) %>%
melt() %>%
setNames(c("rows", "columns", "distance")))
.
是我们传递给特定染色体的数据。我们传递需要找到差异的两列。这应该比为所有进程运行for循环快得多。如果你提供更多的信息,我可能会清理更多的答案。
https://stackoverflow.com/questions/54115939
复制相似问题