比较一个数据帧中多行的一个值与第二个数据帧中多行的值

时间:2018-05-15 19:01:15

标签: r

情景:

2列dataframe_1(300,000行)

头(dataframe_1):

CHR POS

1 2000

1 3000

2 1500

3 3000

3列dataframe_2(300行)

头(dataframe_2):

CHR POS_START POS_END

1 1500 2500

1 3200 4000

2 1200 1600

2 2000 2200

3 5000 5500

4 1000 1200

目标是获取dataframe_1并将每行的POS列与dataframe_2(列POS_START和POS_END)进行比较,并返回一个向量(length = nrow(dataframe_1)),该向量指示dataframe_1的哪一行列出其中的POS值dataframe_2中指示的范围。 请注意,每个POS值都链接到特定的CHR值。

示例返回向量:

CHR POS EXAMPLE_RETURN_VECTOR

1 2000 TRUE

1 3000 FALSE

2 1500 TRUE

3 3000 FALSE

这里最好的策略是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是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)

答案 1 :(得分:0)

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

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

如果您无法做出所有这些假设,那么您可以:

1)合并两个匹配CHR值的表,过滤掉缺少数据的行,然后创建新列,或

2)循环遍历dataframe_1的每一行,对于每一行,将POS值与dataframe_2[dataframe_2.POS_START == dataframe_1.POS_START]dataframe_2[dataframe_2.POS_END == dataframe_1.POS_END]的值进行比较