【问题标题】:Keep common rows among groups based on a column in dplyr根据 dplyr 中的列在组之间保留公共行
【发布时间】:2021-10-07 21:02:20
【问题描述】:

我的数据框是这样的

df <- data.frame(gene=c("A","B","C","A","B","D"), 
                 origin=rep(c("old","new"),each=3),
                 value=sample(rnorm(10,2),6))

  gene origin     value
1    A    old 1.5566908
2    B    old 1.3000358
3    C    old 0.7668213
4    A    new 2.5274712
5    B    new 2.2434525
6    D    new 2.0758326

我想找到两个不同起源组(新旧)之间的共同基因

我希望我的数据看起来像这样

  gene origin     value
1    A    old 1.5566908
2    B    old 1.3000358
4    A    new 2.5274712
5    B    new 2.2434525

感谢任何帮助。理想情况下,我想在使用多列的组中找到共同的行

【问题讨论】:

    标签: r dataframe dplyr filtering tidyverse


    【解决方案1】:

    一种可能是:

    df %>%
        group_by(gene) %>%
        filter(all(c("old", "new") %in% origin))
    
      gene  origin value
      <chr> <chr>  <dbl>
    1 A     old    1.63 
    2 B     old    0.904
    3 A     new    2.18 
    4 B     new    1.24 
    

    【讨论】:

    • 亲爱的 tmfmmk,这是一个超级酷且简洁的解决方案。你能解释一下它是如何工作的吗?看起来很棒
    【解决方案2】:

    我会filter根据重复,从lastfirst扫描。

    library(tidyverse)
    
    df %>% filter(
            duplicated(gene, fromLast = TRUE) | duplicated(gene, fromLast = FALSE)
    )
    
      gene origin    value
    1    A    old 2.665606
    2    B    old 1.565466
    3    A    new 4.025450
    4    B    new 2.647110
    

    注意:我无法复制您的data,因为您没有提供seed

    【讨论】:

      【解决方案3】:

      您可以使用splitreduce获取共同基因并在filter中使用。

      library(dplyr)
      library(purrr)
      
      df %>% filter(gene %in% (split(df$gene, df$origin) %>% reduce(intersect)))
      
      #  gene origin value
      #1    A    old 1.271
      #2    B    old 2.838
      #3    A    new 0.974
      #4    B    new 1.375
      

      或保持在基础 R -

      subset(df, gene %in% Reduce(intersect, split(df$gene, df$origin)))
      

      【讨论】:

        【解决方案4】:

        使用ave + subset 的基本 R 选项

        subset(
          df,
          as.logical(ave(origin,gene,FUN = function(x) all(c("old","new")%in% x)))
        )
        

        给予

          gene origin     value
        1    A    old 0.5994593
        2    B    old 4.0449345
        4    A    new 3.2478612
        5    B    new 0.2673525
        

        【讨论】:

          【解决方案5】:

          base R 中使用subsettable

          subset(df, gene %in% names(which(rowSums(table(gene, origin) > 0) == 2)))
            gene origin     value
          1    A    old 3.0536642
          2    B    old 2.0796124
          4    A    new 0.1621484
          5    B    new 2.3587338
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-01
            • 1970-01-01
            • 2017-06-03
            • 1970-01-01
            • 2023-02-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多