具有公共值的聚合行保留唯一值

时间:2017-09-22 14:27:44

标签: r aggregate

我已尝试从此数据框开始执行以下操作

    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列中有几个基因。

4 个答案:

答案 0 :(得分:3)

甚至另一种选择:

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

答案 1 :(得分:1)

collapse_unique <- function(x) {
    paste(unique(x), collapse = ",")
}

aggregate(Gene.Symbols~Chr, data, collapse_unique)

答案 2 :(得分:1)

使用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

答案 3 :(得分:1)

通过基础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 = ','))