在R中合并重复的数据框数值

4

我有一个非常长的数据框,其中近56列中的1列具有许多不同的值,而其余数据则随第一列ID更改。这里有个例子:

ID  chrom   left    right   ref_seq var_type    zygosity    transcript_name
0   chr1    1590327 1590328 a       SNP         Hom         NM_033486
0   chr1    1590327 1590328 a       SNP         Hom         NM_033487
0   chr1    1590327 1590328 a       SNP         Hom         NM_033488
0   chr1    1590327 1590328 a       SNP         Hom         NM_033489
0   chr1    1590327 1590328 a       SNP         Hom         NM_033492
0   chr1    1590327 1590328 a       SNP         Hom         NM_033493
1   chr1    1590526 1590527 g       SNP         Hom         NM_033486
1   chr1    1590526 1590527 g       SNP         Hom         NM_033487
1   chr1    1590526 1590527 g       SNP         Hom         NM_033488
1   chr1    1590526 1590527 g       SNP         Hom         NM_033489
1   chr1    1590526 1590527 g       SNP         Hom         NM_033492

期望的结果是将任何重复的值连接成逗号分隔的字符串,但仅保留一次ID,如下所示。
ID  chrom   left    right   ref_seq var_type    zygosity    transcript_name
0   chr1    1590327 1590328 a       SNP         Hom         NM_033486NM_033487,NM_033488,NM_033489,NM_033492,NM_033493
1   chr1    1590526 1590527 g       SNP         Hom         NM_033486,NM_033487,NM_033488,NM_033489,NM_033492

我已经搜索了类似的问题,但以下解决方案到目前为止都没有起作用;相反,它们给我返回了一个零行数据框。


为什么你得到了全部为0的结果?你能展示一下你的脚本吗? - Sotos
以下代码对我有效,假设您的工作数据框与提供的相同。df2 <- aggregate(df[,8], df[,-8], FUN = function(X) paste(unique(X), collapse=", ")) - Dave Gruenewald
2个回答

8

另一个使用基本R的解决方案

aggregate(data=df,transcript_name~.,FUN=paste,collapse=",")

感谢@Sotos和@LyzandeR提供的collapse功能。

1
您还需要“折叠”。 - Sotos
1
使用 str(aggregate(data=df,transcript_name~.,FUN=paste)),你会看到差异。 - LyzandeR
或者更好的是,保存两个版本df1 <- aggregate(...paste)df2 <- aggregate(...paste, collapse = ',')View结果。 - Sotos
2
你可以直接使用 toString - talat
1
@LyzandeR和Sotos Ok。我明白了。谢谢。 - user2100721
显示剩余2条评论

4

使用 data.table 的一种方法:

library(data.table)
#setDT will convert the data.frame into data.table
#.SD gives you access to the groups of data.tables created by the 'by' argument
setDT(df)[, list(transcript_name = paste(transcript_name, collapse = ', ')), 
            by = c('ID', 'chrom', 'left', 'right', 'ref_seq', 'var_type', 'zygosity')]
#   ID chrom    left   right ref_seq var_type zygosity                                                  transcript_name
#1:  0  chr1 1590327 1590328       a      SNP      Hom NM_033486, NM_033487, NM_033488, NM_033489, NM_033492, NM_033493
#2:  1  chr1 1590526 1590527       g      SNP      Hom            NM_033486, NM_033487, NM_033488, NM_033489, NM_033492

数据

df <- read.table(header = TRUE, text = 'ID  chrom   left    right   ref_seq var_type    zygosity    transcript_name
0   chr1    1590327 1590328 a   SNP Hom NM_033486
                 0   chr1    1590327 1590328 a   SNP Hom NM_033487
                 0   chr1    1590327 1590328 a   SNP Hom NM_033488
                 0   chr1    1590327 1590328 a   SNP Hom NM_033489
                 0   chr1    1590327 1590328 a   SNP Hom NM_033492
                 0   chr1    1590327 1590328 a   SNP Hom NM_033493
                 1   chr1    1590526 1590527 g   SNP Hom NM_033486
                 1   chr1    1590526 1590527 g   SNP Hom NM_033487
                 1   chr1    1590526 1590527 g   SNP Hom NM_033488
                 1   chr1    1590526 1590527 g   SNP Hom NM_033489
                 1   chr1    1590526 1590527 g   SNP Hom NM_033492')

是啊,这是我通常过度复杂化事情的方式 :P。感谢大家的评论/编辑。@docendodiscimus - LyzandeR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接