【问题标题】:Comparing one value across multiple rows in one data frame with values across multiple rows in a second data frame比较一个数据框中多行中的一个值与第二个数据框中多行中的值
【发布时间】:2018-10-25 17:11:19
【问题描述】:

场景:

2 列 dataframe_1(300,000 行)

head(dataframe_1):

CHR 位置

1 2000

1 3000

2 1500

3 3000

3 列 dataframe_2(300 行)

head(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 示例_RETURN_VECTOR

1 2000 正确

1 3000 错误

2 1500 正确

3 3000 错误

这里最好的策略是什么?

谢谢!

【问题讨论】:

    标签: r


    【解决方案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)
    

    【讨论】:

    • 谢谢!这正是我想要的。
    • @RobertDurruthy-Durruthy 太棒了!你能接受我的回答吗?
    【解决方案2】:

    我们可以假设每个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) 合并具有匹配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] 的值进行比较

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 2022-08-10
      • 2018-03-14
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多