提问者:小点点

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


脚本:

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假的

这里最好的策略是什么?

谢谢


共2个答案

匿名用户

这里有一个关于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]