如何根据重叠的chr起始和终止位置查找和附加基因名?
我有df1:如何根据重叠的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
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)]