我已尝试从此数据框开始执行以下操作
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列中有几个基因。
答案 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)
使用dplyr
和tidyr
#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 = ','))