【问题标题】:How to find two common coulmn in R如何在R中找到两个共同的列
【发布时间】:2020-10-03 19:37:38
【问题描述】:

我有三个不同的数据集,名为 mus、dom 和 cas。它们具有相同的名称,包括 CRA、CHROM、POS、REF 和 ALT。我需要在每个数据集中根据 CHROM 找到相同的 REF 和 ALT 值。换句话说,我希望 REF 和 ALT 值在每个值中都相同。例如 REF: A 和 ALT: T 在所有数据集中都可以找到,它可能在不同的 CHROM 中,此外我需要保留其他列。我怎么能在 R 中做到这一点?请参阅下面的样本格式。每个名为“cas”、“dom”和“mus”的样本都有不同的 CRA 和相同的 CHROM,具有不同的 POS 和 REF 和 ALT。现在我想根据 CHROM 在这三个样本之间找到相同的 REF 和 ALT 值?

CRA CHROM   POS REF ALT
dom_76  chr1    3365296 T   A
dom_76  chr1    3540134 T   C
dom_76  chr1    3665288 A   G
dom_76  chr1    7110674 T   C
dom_76  chr1    8920460 A   G

谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以用bind_rows将数据集绑定成一个单独的数据,同时创建一个id列(.id),然后按'REF'、'ALT'、'CHROM'、filter分组'grp' 的不同元素的数量为 3,即那些在所有三个数据集中具有共同值的元素

    library(dplyr)
    bind_rows(cas, dom, mus, .id = 'grp') %>%
             group_by(REF, ALT, CHROM) %>%
             filter(n_distinct(grp) == 3)
    

    【讨论】:

      【解决方案2】:

      由于 CHROM 在任何地方都是相同的,因此将列保持在排序中是没有用的。 否则,如果我很好地理解了您的问题,那么您将要求对一对变量进行排序。这可以使用 data.table 快速完成,如下所示:

      # Supposing the 3 samples are put together in the same CSV file
      # with space separators
      
      library(data.table)
      DT <- fread("~/Documents/a.csv", sep=" ", header=TRUE)
      setkey(DT, REF, ALT)
      DT[.(REF, ALT), .(CRA, POS, REF, ALT)]
      
      > DT[.(REF, ALT), .(CRA, POS, REF, ALT)]
            CRA     POS REF ALT
      1: dom_76 3665288   A   G
      2: dom_76 8920460   A   G
      3: dom_76 3665288   A   G
      4: dom_76 8920460   A   G
      5: dom_76 3365296   T   A
      6: dom_76 3540134   T   C
      7: dom_76 7110674   T   C
      8: dom_76 3540134   T   C
      9: dom_76 7110674   T   C
      

      如果您出于某种原因仍需要 CHROM 列,请将其保存在“按”分组中:

      > DT[.(REF, ALT), .(CRA, POS, REF, ALT), by="CHROM"]
      
      CHROM    CRA     POS REF ALT
      1:  chr1 dom_76 3665288   A   G
      2:  chr1 dom_76 8920460   A   G
      3:  chr1 dom_76 3665288   A   G
      4:  chr1 dom_76 8920460   A   G
      5:  chr1 dom_76 3365296   T   A
      6:  chr1 dom_76 3540134   T   C
      7:  chr1 dom_76 7110674   T   C
      8:  chr1 dom_76 3540134   T   C
      9:  chr1 dom_76 7110674   T   C
      

      但是您的问题有点模棱两可,因为“常见”可以解释为“平等”。我认为这不是您要求的,但为了完整起见,以防万一,下面是相应的排序(在发布的数据中为空):

      > DT[REF == ALT, .(CRA, POS, REF, ALT), by="CHROM"]
      Empty data.table (0 rows and 4 cols): CRA,POS,REF,ALT
      

      【讨论】:

      • 感谢您的回复。但这对我不起作用。我有错误 Error in vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, : Join results in more than 2^31 rows (internal vecseq达到physical limit)。很可能是错误指定的加入。检查 i 中的重复键值,每个键值都加入 x 中的同一组。如果没问题,请尝试 by=.EACHI 为每个组运行 j 以避免大分配。否则,请搜索此错误消息在 FAQ、Wiki、Stack Overflow 和 data.table 问题跟踪器中寻求建议。
      • 如果您的基础中有重复,则可能会发生这种情况。你应该过滤掉这些重复:DT&lt;-data.table::unique(DT)
      • 非常感谢。它工作正常。我改用 by=EACHI。
      • 这可能会避免你重复,这取决于你的数据结构,虽然它不是一般的。另外,你是由=.EACHI 做的,注意点!
      • 这看起来像是一个不同的问题。为了遵守 SO 规则,您应该重新发帖。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 2018-09-07
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多