【问题标题】:Aggregate rows with a common value retaining unique values聚合具有共同值的行,保留唯一值
【发布时间】:2017-09-22 14:27:44
【问题描述】:

我尝试从这个数据框开始做以下事情

    Chr                Gene.Symbols
2  chr1                       GSTM1
3  chr2                     MIR4432
4  chr2                      BCL11A
5  chr2                      PAPOLG
6  chr2                   LINC01185
7  chr2                   LINC01185
8  chr2              LINC01185, REL
9  chr2                         REL
10 chr2                         REL
11 chr2                         REL
12 chr2                         REL
13 chr2                            
14 chr2                       PUS10
15 chr2             PEX13, KIAA1841

我想要这个结果:

    Chr             Gene.Symbols
2  chr1             GSTM1
3  chr2             MIR4432,BCL11A,PAPOLG,LINC01185,REL,PUS10,PEX13,KIAA1841

我已经设法将基因符号聚合在一起使用:

aggregate(Gene.Symbols~Chr, data, paste, collapse = ",")

我从 this one 等其他问题中了解到,但我无法删除重复项。

有人可以帮帮我吗?

更新: 我还需要一个文件,每行只有一个基因名称(没有“Chr”列)。如何转置基因名称? 我现在从一个文件开始,该文件的行数与 Chr 一样多,每一行在 Gene.Symbols 列中有多个基因。

【问题讨论】:

  • 在第 8 行,LINC01185, RELLINC01185,也在第 15 行 PEX13, KIAA1841PEX13
  • @Sotos 我认为这个问题与“重复”的问题有点不同
  • @Wen 嗯...我刚刚注意到LINC01185, RELREL。你说得对,我会重新打开

标签: r aggregate


【解决方案1】:

甚至是另一种选择:

library(splitstackshape) # automatically loads the 'data.table'-package
cSplit(mydf, 'Gene.Symbols', sep = ','
       , direction = 'long')[, .(Gene.Symbols = toString(unique(Gene.Symbols)))
                             , by = Chr]

给出:

    Chr                                                    Gene.Symbols
1: chr1                                                           GSTM1
2: chr2 MIR4432, BCL11A, PAPOLG, LINC01185, REL, PUS10, PEX13, KIAA1841

【讨论】:

    【解决方案2】:

    通过基础 R 分两步实现的想法,

    dd <- aggregate(Gene.Symbols ~ Chr, df, paste, collapse = ', ')
    
    dd$Gene.Symbols <- sapply(strsplit(dd$Gene.Symbols, ", "), function(i) 
                                                        paste(unique(i), collapse = ","))
    

    给出,

    #   Chr                                              Gene.Symbols
    #1 chr1                                                     GSTM1
    #2 chr2 MIR4432,BCL11A,PAPOLG,LINC01185,REL,,PUS10,PEX13,KIAA1841
    

    单线(@Cath 的赞美)将是,

    aggregate(Gene.Symbols ~ Chr, df, function(gene) 
                                  paste(unique(unlist(strsplit(gene, ", "))), collapse = ',')) 
    

    【讨论】:

    • 我尝试了这两个步骤,但我一直有一些重复 Chr Gene.Symbols 2 chr2 MIR4432, BCL11A, PAPOLG, LINC01185, REL, REL, , PUS10, PEX13, KIAA1841
    • @FrancescaScellato 分隔符错误。应该是", "
    • 为了避免sapply这一步,可以直接做:aggregate(Gene.Symbols ~ Chr, df, function(gene) paste(unique(unlist(strsplit(gene, ", "))), collapse = ','))
    【解决方案3】:
    collapse_unique <- function(x) {
        paste(unique(x), collapse = ",")
    }
    
    aggregate(Gene.Symbols~Chr, data, collapse_unique)
    

    【讨论】:

      【解决方案4】:

      通过使用dplyrtidyr

      #1st unnest your string
      df=df %>%
          transform( Gene.Symbols = strsplit( Gene.Symbols, ",")) %>%
          unnest( Gene.Symbols)
      # then group by 
      df%>%group_by(Chr)%>%summarise(Gene.Symbols=toString(unique(Gene.Symbols)))
      
      # A tibble: 2 x 2
          Chr                                                           Gene.Symbols
        <chr>                                                                  <chr>
      1  chr1                                                                  GSTM1
      2  chr2       MIR4432, BCL11A, PAPOLG, LINC01185, REL, PUS10, PEX13,  KIAA1841
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-21
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多