【问题标题】:Obtain the specific range that overlap获取重叠的具体范围
【发布时间】:2016-12-01 12:11:37
【问题描述】:

我有两个数据框: cnv_1

chr     start   end
3   62860387    63000898
12  31296219    31406907
14  39762575    39769146
19  43372386    43519442
19  56419263    56572829

cnv_2

chr     start   end
6   30994163    30995078
19  43403531    44608011
18  1731154 1833682
3   46985863    47164711

每个大约有 150000 个条目。我想知道cnv_1overlap 的哪些片段与cnv_2 以任何方式重叠,并且-这对我来说最重要-获得重叠的特定区域。 例如,对示例的 data.frames 这样做,以获得:

chr     start   end
19  43403531 43519442

非常感谢

【问题讨论】:

标签: r dataframe overlap iranges genomicranges


【解决方案1】:

基于共享的链接:

cnv_3 <- merge(cnv_1, cnv_2, by = "chr", suffixes = letters[1:2])
# below function has 3 conditions : 1 fully inside the interval and 2 partial overlap cases
func <- function(x){
  if(x["starta"]>x["startb"] & x["enda"]<x["endb"])
    x
  else if( x["starta"]<x["startb"] & x["enda"] < x["endb"]){
    x["starta"]=x["startb"]
    x
  } else if( x["starta"] >x["startb"]&x["starta"]<x["endb"]&x["enda"]>x["endb"]){
    x["enda"]=x["endb"]
    x
  }
  else
    c(x[1] ,rep(NA, length(x)-1))
}


df <-  data.frame(t(apply(cnv_3, 1, func)))
df <- df[!is.na(df[,1]),][1:3]
colnames(df) <- colnames(cnv_1)
# incase you want all the original cnv_1 rows with NA's for non-overlapping
xxx <- cnv_1[!(cnv_1$chr %in% df$chr),]
xxx$start <- xxx$end <- NA
rbind(xxx, df)
#   chr    start      end
#2   12       NA       NA
#3   14       NA       NA
#31   3       NA       NA
#4   19 43403531 43519442
#5   19       NA       NA

【讨论】:

  • 嗨@joel.wilson,也可以获得不重叠的行吗?表示 NA 例如...非常感谢。
  • 所有列的不适用?
  • 对不起,它不起作用,重叠的特定区域。
  • 关于真实数据?
【解决方案2】:

这是一个dplyr 链,它连接两个数据帧之间的公共区域,查找重叠并获取开始和结束值。

library(dplyr)
inner_join(cnv_1, cnv_2, by="chr") %>% 
  filter(!(start.x > end.y | start.y > end.x)) %>%
  transmute(chr, start.o = ifelse(start.y > start.x, start.y, start.x),
                   end.o = ifelse(end.y > end.x, end.x, end.y))

输出是:

  chr  start.o    end.o
1  19 43403531 43519442

这对两个数据帧对称地起作用。如果您只想要单向重叠,您可以根据需要简化 filtertransmute 表达式。

【讨论】:

  • 感谢@Joe,但我想获得这两个区域共有的范围;两个范围共有的“开始”和“结束”。非常感谢
  • 完美@Joe;并且有可能知道与 cnv_2 范围不重叠的 cnv_1 范围(行),我的意思是,在输出中我获得了重叠的区域和具有 NA 的区域。谢谢。
  • 很高兴工作!你介意接受吗? (投票数下方的勾号。)
  • 抱歉,Joe,但是 inner_join 在哪个包中?我收到此消息“eval 中的错误(expr,envir,enclos):找不到函数“inner_join””
  • 你必须安装并加载dplyr
猜你喜欢
  • 2017-06-04
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多