【问题标题】:Concatenate duplicate dataframe values in R连接R中的重复数据框值
【发布时间】:2016-07-08 13:50:53
【问题描述】:

我有一个很长的数据框,其中近 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

我已经搜索过类似的问题,the following solutions 到目前为止还没有工作;相反,他们返回给我一个零行数据框。

【问题讨论】:

  • 为什么全是0?你能展示你的脚本不起作用吗?
  • 假设您的工作数据框与提供的相同,以下代码对我有用。 df2 <- aggregate(df[,8], df[,-8], FUN = function(X) paste(unique(X), collapse=", "))

标签: r dataframe duplicates


【解决方案1】:

使用基础 R 的另一种解决方案

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

感谢@Sotos 和@LyzanderR 提供collapse

【讨论】:

  • 您还需要collapse
  • @user2100721 使用 str(aggregate(data=df,transcript_name~.,FUN=paste)) 你会看到不同
  • 或者更好的是,保存df1 <- aggregate(...paste)df2 <- aggregate(...paste, collapse = ',')View这两个版本的结果
  • 你可以改用toString
  • @LyzanderR & Sotos 好的。我明白了。谢谢。
【解决方案2】:

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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
相关资源
最近更新 更多