【问题标题】:select unique rows containing maximum difference between column IDs选择包含列 ID 之间最大差异的唯一行
【发布时间】:2021-10-20 09:09:09
【问题描述】:

我有大量具有多个相同行名的数据框,但每个数据框的特定列 ID 的值不同。我想提取两列 ID 差异最大的唯一行。

例如,这里是一个示例数据

    seqname             source           start  end Name    score
    chr08:37848-37905   PRINTS           24     37  AAA     1.40E-05
    chr08:37848-37905   PANTHER          1      57  AAA     1.10E-15
    chr08:37848-37905   SUPERFAMILY      3      57  AAA     6.80E-13
    chr08:37848-37905   Gene3D           1      57  AAA     6.40E-17
    chr05:55489-55514   Pfam             2      23  BBB     7.30E-07
    chr05:55489-55514   Gene3D           1      25  BBB     7.10E-07
    chr05:55489-55514   ProSiteProfiles  1      25  BBB     9.683545
    chr05:55489-55514   SUPERFAMILY      2      24  BBB     1.23E-06

我想获取具有最小 start 和最大 end 值的唯一行的所有列。输出看起来像

seqname             source           start  end   Name    score
chr08:37848-37905   Gene3D           1      57    AAA     6.40E-17
chr05:55489-55514   Gene3D           1      25    BBB    7.10E-07

group_by 结果仅适用于选定的汇总 ID,但我无法确定保留具有这些选定值的行

     data %>% dplyr::group_by(seqname) %>% 
        summarize(start=min(start), end=max(end))

感谢您的帮助。

【问题讨论】:

  • 在您的示例中 - 为什么第一组选择 Gene3D 而不是 PANTHER?它们的开始值和结束值是否相同?
  • 在第一组中,Gene3D 显示的得分最低,这是它出现的 p 值,是我感兴趣的。

标签: r dataframe matrix tidyverse


【解决方案1】:

你很接近 - 你只需要使用filter 而不是summarize。像这样:

 data %>% dplyr::group_by(seqname) %>% 
    filter(start==min(start), end==max(end))

这假定对于每个seqname,恰好有一行同时具有最小开始和最大结束。如果超过一个,它们都将被退回。如果不同的行有最大值和最小值,那么它们都不会被返回。

如果您想要最小开始的行和最大结束的行,即使它们是不同的行,也可以将其用于过滤器

    summarize(start==min(start) | end==max(end))

【讨论】:

  • 非常感谢,@John Paul。它工作得很好。我在过滤器函数中添加了 score==min(score) 以获取我正在寻找的最低值。
猜你喜欢
  • 2019-04-07
  • 2014-10-22
  • 2017-04-18
  • 2012-10-09
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
相关资源
最近更新 更多