R 将一个数据帧中跨多行的一个值与第二个数据帧中跨多行的值进行比较

R 将一个数据帧中跨多行的一个值与第二个数据帧中跨多行的值进行比较,r,R,情景: 2列数据帧_1(300000行) 头部(数据帧_1): CHR POS 2000年1月 1 3000 21500 33000 3列数据帧_2(300行) 头部(数据帧2): CHR位置开始位置结束 1500 2500 13204000 21200 1600 20002200 35005500 4 1000 1200 目标是获取dataframe_1并将每行的POS列与dataframe_2(列POS_开始和POS_结束)进行比较,并返回一个向量(长度=nrow(dataframe_1))

情景:

2列数据帧_1(300000行)

头部(数据帧_1):

CHR POS

2000年1月

1 3000

21500

33000

3列数据帧_2(300行)

头部(数据帧2):

CHR位置开始位置结束

1500 2500

13204000

21200 1600

20002200

35005500

4 1000 1200

目标是获取dataframe_1并将每行的POS列与dataframe_2(列POS_开始和POS_结束)进行比较,并返回一个向量(长度=nrow(dataframe_1)),该向量指示dataframe_1的哪一行列出了在dataframe_2中所示范围内的POS值。 请注意,每个POS值都链接到特定的CHR值

返回向量示例:

CHR POS示例返回向量

2000对

1 3000个错误

21500对

三千个假

这里最好的策略是什么


谢谢

我们可以假设每个
CHR
值只出现一次吗?我们还可以假设出现在
dataframe_1
中的每个
CHR
值也出现在
dataframe_2
中,反之亦然吗?我们还可以假设两个表都是按
CHR
值排序的吗?如果是这样,您可以创建一个新列,如下所示:

dataframe_1['NEW_COLUMN'] = dataframe_1.POS >= dataframe_2.POS_START & dataframe_1.POS <= dataframe_2.POS_END

dataframe\u 1['NEW\u COLUMN']=dataframe\u 1.POS>=dataframe\u 2.POS\u START&dataframe\u 1.POS下面是一个带有
dplyr
的答案:

library(dplyr)

df1 <- tribble(
     ~CHR, ~POS,
     1,  2000,                  
     1,  3000,
     2,  1500,
     3,  3000
)

df2 <- tribble(
     ~CHR, ~POS_START, ~POS_END,
     1, 1500, 2500,                  
     1, 3200, 4000,
     2, 1200, 1600,
     2, 2000, 2200,
     3, 5000, 5500,
     4, 1000, 1200
)

df1 %>% 
     left_join(df2, by = 'CHR') %>% 
     mutate(IN_RANGE = POS >= POS_START & POS <= POS_END) %>% 
     group_by(CHR, POS) %>% 
     summarize(IN_RANGE = sum(IN_RANGE) > 0)
库(dplyr)
df1%
突变(在位置范围内=位置>=位置开始和位置%
分组依据(CHR,POS)%>%
汇总(范围内=总和(范围内)>0)

谢谢!这正是我想要的。@RobertDurruthy Durruthy真棒!你能接受我的回答吗?