Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据重叠的chr起始和终止位置查找和附加基因名?_R_Range - Fatal编程技术网

如何根据重叠的chr起始和终止位置查找和附加基因名?

如何根据重叠的chr起始和终止位置查找和附加基因名?,r,range,R,Range,我有df1: 1 25 85 1 2000 3000 2 345 2300 和df2: 1 34 45 geneX 1 100 1000 geneD 2 456 1500 geneH 所需输出: 1 25 85 geneX 1 2000 3000 NA 2 345 2300 geneH 我试过两种方法: library(data.table) setDT(df1, key = names(df1)) setDT(df2, key = key(df1)) overlaps <- fov

我有df1:

1 25 85
1 2000 3000
2 345 2300
和df2:

1 34 45 geneX
1 100 1000 geneD
2 456 1500 geneH
所需输出:

1 25 85 geneX
1 2000 3000 NA
2 345 2300 geneH
我试过两种方法:

library(data.table)
setDT(df1, key = names(df1))
setDT(df2, key = key(df1))
overlaps <- foverlaps(df1, df2, type = "any", nomatch = 0L)[, -c("chromosome","start", "stop")]
上面的代码多次给了我一些区域

rangesC <- NULL
sb <- NULL
sb$gene <- NULL
for(i in levels(df1$chromosome)){
  sb <- subset(df1, df1$chromosome == i)
  s <- subset(df2, df2$chromosome == i)
  for(j in 1:nrow(sb)){
    sb$gene[j] <- as.character(s$gene[which(s$start < sb$start[j] &  s$stop > sb$stop[j])])
  }
  rangesC <- rbind(rangesC, sb)
}
但是这个代码不起作用。我更愿意维护和使用我在上面尝试过的方法。

您可以使用fuzzyjoin软件包:

fuzzyjoin::fuzzy_left_join(df1, df2, 
                           by = c('V1', 'V2', 'V3'), 
                           match_fun = c(`==`, `<=`, `>=`)) %>%
  dplyr::select(V1 = V1.x, V2 = V2.x, V3 = V3.x, V4)

#  V1   V2   V3    V4
#1  1   25   85 geneX
#2  1 2000 3000  <NA>
#3  2  345 2300 geneH

这是我的解决方案,我使用库dplyr

以下是您向我们展示的数据:

a = matrix(c(25 ,85,
 2000 ,3000,
 345 ,2300),byrow = T,ncol = 2)

b =  matrix(c(34 ,45 ,'geneX',
 100, 1000 ,'geneD',
 456, 1500 ,'geneH'),ncol=3,byrow=T)
这是我的解决方案,我使用for循环:

res = matrix(ncol=3)[-1,]
if(nrow(a)==nrow(b)){
for(i in 1:nrow(a)){
  
  if(between(as.numeric(b[i,1]),a[i,1],a[i,2])&between(as.numeric(b[i,2]),a[i,1],a[i,2])){
    res= rbind(res, c(a[i,],b[i,3]))
  }else{
    res=rbind(res, c(a[i,],NA))
  }
  
}
}
res


#> res
#     [,1]   [,2]   [,3]   
#[1,] "25"   "85"   "geneX"
#[2,] "2000" "3000" NA     
#[3,] "345"  "2300" "geneH"

我认为在您的情况下可以删除所有as.numeric,因为您的数据似乎已经是数字了

更快的选择是从data.table中进行非等联接


如果我错了,请纠正我,但问题是,如果df1中的一个值落在df2中基因的窗口内,您想在df1中指定基因名称吗?确切地说,我的目标是将基因名称指定给df1。第二个问题,两个df中的行之间是否存在关联?比如,对于df1中的第1行,您需要查看df2中的所有基因还是只查看第一行?只要基因在给定染色体的间隔内,我的染色体就很好,这就给出了我和错误:错误:无法分配大小为50.5 Gb的载体
library(data.table)
setDT(df1)[df2, on = .(V1, V2 <= V2, V3 >= V3)]