R 获取重叠的特定范围

R 获取重叠的特定范围,r,dataframe,overlap,iranges,genomicranges,R,Dataframe,Overlap,Iranges,Genomicranges,我有两个数据帧: cnv_1 cnv_2 每个项目大约有150000个条目。我想知道cnv_1的哪些片段以任何方式与cnv_2重叠,并且-这对我来说是最重要的-以获得重叠的特定区域。 例如,对示例的data.frames执行此操作,以获得: chr start end 19 43403531 43519442 非常感谢这里有一个dplyr链,它连接两个数据帧之间的公共区域,查找重叠并获取起始值和结束值 library(dplyr) inner_join(cnv_1, cnv_2,

我有两个数据帧: cnv_1

cnv_2

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

chr     start   end
19  43403531 43519442

非常感谢

这里有一个
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

这对两个数据帧对称工作。如果您只需要单向重叠,可以根据需要简化
过滤器
转换
表达式。

这里有一个
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

这对两个数据帧对称工作。如果您只需要单向重叠,可以根据需要简化
过滤器
转换
表达式。

基于共享链接:

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

cnv_3基于共享的链接:

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


cnv_3看看这里:谢谢@user1981275,但我还需要知道重叠的确切范围。我不知道是否可以使用irange,请看这里:谢谢@user1981275,但我还需要知道重叠的确切范围。我不知道是否可以使用IRangesthanks@Joe,但我想获得这两个地区的共同范围;这两个范围的“开始”和“结束”是相同的。谢谢你,乔;可以知道cnv_1范围(行)不与cnv_2范围重叠,我的意思是,在输出中,我得到了重叠的区域和与NA重叠的区域。谢谢,很高兴能成功!你介意接受吗?(投票号码下方的勾号)对不起,乔,请问您加入的是哪个包裹?我收到消息“Error in eval(expr、envir、ENCLOSE):找不到函数“INTERNAR_join”“”您必须安装并加载
dplyr
。谢谢@Joe,但我想获得这两个区域的共同范围;这两个范围的“开始”和“结束”是相同的。谢谢你,乔;可以知道cnv_1范围(行)不与cnv_2范围重叠,我的意思是,在输出中,我得到了重叠的区域和与NA重叠的区域。谢谢,很高兴能成功!你介意接受吗?(投票号码下方的勾号)对不起,乔,请问您加入的是哪个包裹?我收到消息“eval(expr、envir、enclose)中出错”:找不到函数“internal_join”。您必须安装并加载
dplyr
。Hi@joel.wilson,是否也可以获得不重叠的行?举个例子。。。非常感谢。NA在所有列上?很抱歉,它不起作用,重叠的特定区域。在真实数据上?Hi@joel.wilson,也可以获得不重叠的行吗?举个例子。。。非常感谢。NA在所有列上?很抱歉,它不起作用,重叠的特定区域。在真实数据上?