如何从列中获取行值并根据不同的列值将它们组合,按“,”分隔?

How do I take row values from a column and combine them, sep by "," based on different column value?

我正在处理蛋白质组数据并测试分析软件版本之间的差异。我们想要一个 table 让我们知道蛋白质出现在哪个版本的软件中。

下面是数据的简化版table我目前有:

Version Protein.ID Protein name
1.1     A          name 1
1.2     A          name 1
1.1     B          name 2
1.2     B          name 2

我希望我的 table 看起来像这样:

Version   Protein.ID Protein name
1.1, 1.2  A          name 1
1.1, 1.2  B          name 2

我在这里和网上找了 2 天,但找不到解决方案。

我尝试过使用传播和聚合,但都没有用。我要么得到大量的列,要么得到一个缺少我想要的信息的列。我尝试使用一些基本的 R 命令,如粘贴,但无法删除重复值。

我尝试过的例子:

allver.mergeVerID <- spread(allver.ids, Protein.ID, Ver.ID.Porder)
Error: Each row of output must be identified by a unique combination of keys. 
Keys are shared for 5311 rows:

我在使用

时也遇到了这个错误
allver.mergeVerID <- allver.ids %>% group_by(Protein.ID) %>% 
  summarise(Ver.ID.Porder= toString(Ver.ID.Porder), )

allver.mergeVerID <- aggregate(Ver.ID.Porder ~ Protein.ID, allver.ids, toString)

这个错误是什么意思?

这是一种方法。按 'Protein.ID' 分组后,summarise 'Version' 通过 paste 将元素组合在一起

library(dplyr)
df1 %>%
  group_by(Protein.ID, `Protein name`) %>%
  summarise(Version = toString(Version))

aggregate 来自 base R

aggregate(Version ~ Protein.ID + `Protein name`, df1, toString)
#  Protein.ID Protein name  Version
#1          A       name 1 1.1, 1.2
#2          B       name 2 1.1, 1.2

注意:两种解决方案都符合预期输出

数据

df1 <- data.frame(Version = c(1.1, 1.2, 1.1, 1.2),
     Protein.ID = c('A', 'A', 'B', 'B'), `Protein name` = c('name 1', 
  'name 1', 'name 2', 'name 2'), check.names = FALSE, stringsAsFactors = FALSE)