关于r:比较一个数据帧中多个行中的一个值与第二数据帧中多个行中的值


Comparing one value across multiple rows in one data frame with values across multiple rows in a second data frame

场景:

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)进行比较,并返回一个向量(长度= nrow(dataframe_1)),该向量指示dataframe_1的哪一行列出了POS值,其范围为在dataframe_2中指示。
请注意,每个POS值都链接到特定的CHR值。

示例返回向量:

CHR POS示例_RETURN_VECTOR

1 2000是

1 3000假

2 1500是

3 3000假

这里最好的策略是什么?

谢谢!


这是dplyr的答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)


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

1
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]的值进行比较