情景:
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
这里最好的策略是什么?
谢谢!
答案 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]
的值进行比较