首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用多条染色体计算基因之间的距离

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

Stack Overflow用户
提问于 2019-01-09 18:03:28
回答 1查看 448关注 0票数 1

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

你不能测量1号染色体上的基因和2号染色体上的基因之间的距离。

我想像这样计算距离:基因2的起始位置--基因1的停止位置。然后,这些基因之间的距离。

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

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

希望你们能帮我。

关于下面的代码:这三个向量只是起始点停止位置和染色体的向量。它们都是一样长的。染色体是一个载体,包含每个基因的染色体数目。

代码语言:javascript
运行
复制
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  
    }

}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-09 19:15:57

代码语言:javascript
运行
复制
library(tidyverse) # for all the tidyverse goodies
library(reshape2) # For the melt function

由于您没有提供一个可重复的例子,我冒昧地制作了我自己的玩具数据格式如下。它只有2条染色体,但是这种方法应该适用于任意数目的染色体和基因。

代码语言:javascript
运行
复制
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澄清说,他们只想找出距离基因的距离,而不是其他所有的基因。做后半部分的方法在底部,因为我觉得它很有趣。新的解决办法是:

代码语言:javascript
运行
复制
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的末尾,这对我来说并不合适,但我已经有一段时间没有做过biochem了:)。因为您想要一个单对列表,所以我们可以折叠它(熔体函数)。

下面的代码有点模糊,所以让我们把它分解一下。

代码语言:javascript
运行
复制
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. 熔融函数将矩阵转化为一个数据,用于指定它用来计算差异的两个基因。他们是数字列出的,你可以回去比较它。我建议使用安排来设置订单,这样您就可以轻松地将其引用回来。
  5. setNames只是将列名设置为更可编辑的内容。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54115939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档