从昨天开始,我一直在努力解决我的问题... 我认为,最好的解释是当我向您展示示例时,所以我有两个df的x和y,它们看起来像这样:
ID_x <- c('x1','x2','x3','x4','x5','x6','x7','x8','x9','x10')
chr_x <- c('chr1','chr1','chr1','chr1','chr1','chr1','chr1','chr1','chrX','chrY')
start <- c(1,2,3,4,50,60,70,80,9,100)
stop <- c(10,20,30,40,500,600,700,800,95,1000)
x <- data.frame(ID_x,chr_x,start,stop)
> x
ID_x chr_x start stop
1 x1 chr1 1 10
2 x2 chr1 2 20
3 x3 chr1 3 30
4 x4 chr1 4 40
5 x5 chr1 50 500
6 x6 chr1 60 600
7 x7 chr1 70 700
8 x8 chr1 80 800
9 x9 chrX 9 90
10 x10 chrY 100 1000
第二个:
ID_y <- c('y1','y2','y3','y4','y5','y6','y7','y8','y9','y10')
chr_y <- c('chr1','chr1','chr1','chr1','chr2','chr2','chr3','chr3','chrX','chrY')
pos_y <- c(8,9,15,31,41,2,81,8,91,8)
y <- data.frame(ID_y,chr_y,pos_y)
> y
ID_y chr_y pos_y
1 y1 chr1 8
2 y2 chr1 9
3 y3 chr1 15
4 y4 chr1 31
5 y5 chr2 41
6 y6 chr2 2
7 y7 chr3 81
8 y8 chr3 8
9 y9 chrX 91
10 y10 chrY 8
现在,我想根据范围(开始,停止)和chr将第二个df(y)的行映射到第一个df(x)。 我想列出从y df(如果它们满足条件)到df x的每一行的所有id。 没有这样的id_y,然后是NA。 所以预期的结果:
ID_x chr_x start stop ID_y pos_y
1 x1 chr1 1 10 y1,y2 8,9
2 x2 chr1 2 20 y1,y2,y3 8,9,15
3 x3 chr1 3 30 y1,y2,y3,y4 8,9,15,31
4 x4 chr1 4 40 y1,y2,y3,y4 8,9,15,31
5 x5 chr1 50 500 NA NA
6 x6 chr1 60 600 NA NA
7 x7 chr1 70 700 NA NA
8 x8 chr1 80 800 NA NA
9 x9 chrX 9 95 y9 91
10 x10 chrY 100 1000 NA NA
乍一看,我认为这只是小菜一碟,但是当我尝试解决此问题时,我尝试了几种方法...
与apply()
嵌套ifelse()
给了我一个巨大的矩阵,里面有很多NA ...
我发现了类似的问题和解决方案here,但是我的原始数据集非常庞大,df x有134748行,df y有865859行。我遇到了内存分配错误,即使我尝试用一个染色体执行此操作也是如此。
您能给我一个提示怎么做吗?
谢谢你, 亚当
答案 0 :(得分:2)
应该使用data.table
连接来解决此问题,但这是使用dplyr
进行连接的一种方法。我们首先通过left_join
列来制作x
和y
的{{1}},然后是"chr"
和filter
之间的start
行,请为每个stop
,chr_x
和start
创建一个逗号分隔的字符串,最后为stop
和right_join
创建一个x
缺失范围。
NA