脚本:
2列dataframe_1(300,000行)
主管(dataframe_1):
Cr POS
1 2000
1 3000
2 1500
3 3000
3列数据帧_2(300行)
头部(数据帧2):
POS_STARTPOS_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的哪一行列出了dataframe_2中指示的范围内的POS值。请注意,每个POS值都链接到特定的HR值。
示例返回向量:
CHR POS示例返回向量
1 2000真
1 3000假的
21500对
3 3000假的
这里最好的策略是什么?
谢谢
这里有一个关于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)
我们是否可以假设每个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
如果你不能做出所有这些假设,那么你可以:
1)合并两个具有匹配cr
值的表,筛选出缺少数据的行,然后创建新列,或者
2)循环遍历dataframe_1
的每一行,对于每一行,将POS
值与dataframe_2[dataframe_2的值进行比较。POS_START==dataframe_1。POS_START]
和dataframe_2[dataframe_2。POS_END==dataframe_1。POS_END]