两个数据帧,连接ID和从1 df开始的位置(如果值在第二df的范围内

时间:2019-10-09 05:26:56

标签: r dataframe dplyr apply

从昨天开始,我一直在努力解决我的问题... 我认为,最好的解释是当我向您展示示例时,所以我有两个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行。我遇到了内存分配错误,即使我尝试用一​​个染色体执行此操作也是如此。

您能给我一个提示怎么做吗?

谢谢你, 亚当

1 个答案:

答案 0 :(得分:2)

应该使用data.table连接来解决此问题,但这是使用dplyr进行连接的一种方法。我们首先通过left_join列来制作xy的{​​{1}},然后是"chr"filter之间的start行,请为每个stopchr_xstart创建一个逗号分隔的字符串,最后为stopright_join创建一个x缺失范围。

NA