我在R中有一个数据帧,它由两列组成,如下所示:
x <- data.frame("gene" = c('gene1', 'gene2', 'gene3', 'gene3', 'gene4', 'gene5', 'gene5'), "info" = c('A1','B2','A45','B89','A1','C46','D89'))
x
数据帧如下所示:
gene info 1 gene1 A1 2 gene2 B2 3 gene3 A45 4 gene3 B89 5 gene4 A1 6 gene5 C46 7 gene5 D89
您会注意到基因列有几个同名条目(基因3和基因5(。我想改变这一点,使每个基因只占一行。因此,我想将数据帧重组为这样的东西:
gene info 1 gene1 A1 2 gene2 B2 3 gene3 A45,B89 4 gene4 A1 5 gene5 C46,D89
我不知道该怎么做。我发现这篇关于类似内容的帖子。在那里,他们必须取不同行的总和,但我只想把基因ID相同的行的信息值放在一起。
有人知道怎么做吗?我目前在R工作,但bash解决方案也会有所帮助。
已经谢谢了!
一个简单的基本R选项使用aggregate
> aggregate(info ~ gene, x, c)
gene info
1 gene1 A1
2 gene2 B2
3 gene3 A45, B89
4 gene4 A1
5 gene5 C46, D89
带有data.table
的选项
library(data.table)
setDT(x)[, .(info = toString(info)), gene]
您可以使用dplyr进行以下操作:
library(dplyr)
x %>% group_by(gene) %>% summarize(info = paste(info, collapse =','))
这会给你
gene info
<chr> <chr>
1 gene1 A1
2 gene2 B2
3 gene3 A45,B89
4 gene4 A1
5 gene5 C46,D89