如何聚合数据框并通过 r 中的重复行对列的值求和

Posted

技术标签:

【中文标题】如何聚合数据框并通过 r 中的重复行对列的值求和【英文标题】:How do I aggregate a dataframe and sum the values of a column by repeated rows in r 【发布时间】:2020-08-31 13:30:13 【问题描述】:

我正在尝试聚合数据框以删除重复的行,但我需要对计数列的值求和并将其用作该行值的新计数。我有以下数据框:

  count        freq  cdr3nt cdr3aa         v      d       j  VEnd  DStart   DEnd   JStart
   3154    0.036110 TGTGCCA  CASSE   TRBV6-1  TRBD1 TRBJ2-6  13    18       22     24
   2800    0.038394 TGTGCCA  CASSE   TRBV6-1  TRBD1 TRBJ2-6  13    18       22     24
   2608    0.033014 TGTGCCA  CASSE   TRBV6-1  TRBD1 TRBJ2-6  13    18       22     24
    412    0.004717 TGCGCCA  CASMG   TRBV10-2 TRBD1 TRBJ1-1   9    15       19     20
    366    0.005015 TGCGCCA  CASMG   TRBV10-2 TRBD1 TRBJ1-1   9    15       19     20
    310    0.004250 TGCAGTG  CSARD   TRBV20-1 TRBD1 TRBJ1-5  15    17       23     31

我需要解决这个问题:

   count    freq    cdr3nt    cdr3aa   v       d     j     VEnd  DStart   DEnd   JStart
   8562    0.048822 TGTGCCA  CASSE   TRBV6-1  TRBD1 TRBJ2-6  13    18       22     24
    778    0.003332 TGCGCCA  CASMG   TRBV10-2 TRBD1 TRBJ1-1   9    15       19     20
    310    0.004250 TGCAGTG  CSARD   TRBV20-1 TRBD1 TRBJ1-5  15    17       23     31

相反,我得到了这个:

      count    freq    cdr3nt    cdr3aa   v       d     j     VEnd  DStart   DEnd   JStart
        3    0.601110 TGTGCCA  CASSE   TRBV6-1  TRBD1 TRBJ2-6  13    18       22     24
        2    0.506717 TGCGCCA  CASMG   TRBV10-2 TRBD1 TRBJ1-1   9    15       19     20
        1    0.004250 TGCAGTG  CSARD   TRBV20-1 TRBD1 TRBJ1-5  15    17       23     31

这里有一段代码不能正常工作:

  agg_df <- within(aggregate(count ~ cdr3nt + cdr3aa + v + d + j + VEnd + DStart + 
             DEnd +   JStart, data = final_df, 
                FUN = length), freq <- count/sum(count))


  agg_df1 <-select(agg_df, count, freq, cdr3nt, cdr3aa, v, d, j, VEnd, DStart, DEnd, JStart) 

不是添加相应重复行的“计数”值,所以我可以重新计算频率,它基本上是计算特定行重复的次数。任何想法都非常感谢。谢谢。

【问题讨论】:

请提供代码以制作可重现的示例,查看dput() 函数 【参考方案1】:

FUN = length 的使用导致count 的输出值成为每个 by 组的出现次数。相反,使用FUN = sum 来计算输入count 列的总和。

textFile <- "  count        freq  cdr3nt cdr3aa         v      d       j  VEnd  DStart   DEnd   JStart
   3154    0.036110 TGTGCCA  CASSE   TRBV6-1  TRBD1 TRBJ2-6  13    18       22     24
   2800    0.038394 TGTGCCA  CASSE   TRBV6-1  TRBD1 TRBJ2-6  13    18       22     24
   2608    0.033014 TGTGCCA  CASSE   TRBV6-1  TRBD1 TRBJ2-6  13    18       22     24
    412    0.004717 TGCGCCA  CASMG   TRBV10-2 TRBD1 TRBJ1-1   9    15       19     20
    366    0.005015 TGCGCCA  CASMG   TRBV10-2 TRBD1 TRBJ1-1   9    15       19     20
    310    0.004250 TGCAGTG  CSARD   TRBV20-1 TRBD1 TRBJ1-5  15    17       23     31"

final_df <- read.table(text = textFile,
                   header = TRUE)

# original code had FUN = length, which returned the number of rows per
# combination of by groups 
agg_df <- within(aggregate(count ~ cdr3nt + cdr3aa + v + d + j + VEnd + DStart + 
          DEnd +   JStart, data = final_df, FUN = sum), freq <- count/sum(count))
agg_df

...和输出:

> agg_df
   cdr3nt cdr3aa        v     d       j VEnd DStart DEnd JStart count       freq
1 TGCGCCA  CASMG TRBV10-2 TRBD1 TRBJ1-1    9     15   19     20   778 0.08062176
2 TGTGCCA  CASSE  TRBV6-1 TRBD1 TRBJ2-6   13     18   22     24  8562 0.88725389
3 TGCAGTG  CSARD TRBV20-1 TRBD1 TRBJ1-5   15     17   23     31   310 0.03212435
> 

我们可以确认freq列的准确性如下:

> # confirm accuracy 
> agg_df$count / sum(agg_df$count)
[1] 0.08062176 0.88725389 0.03212435
> 

【讨论】:

所以代码基本上没问题,除了 FUN 功能。很棒的收获。谢谢。我一直在绞尽脑汁试图找出问题所在。它检查了我的原始数据集。谢谢一百万。 @Orion11 - 不客气。是的,除了FUN= 参数之外,代码都很好。

以上是关于如何聚合数据框并通过 r 中的重复行对列的值求和的主要内容,如果未能解决你的问题,请参考以下文章

根据来自不同列的 2 个其他值对列的值求和

使用子查询对列的值求和

R-折叠行并对列中的值求和

使用 Linux 工具根据另一列的 id 对列的值求和

按场景/年重复对列中的 46 个单元格求和

聚合后如何有条件地对来自不同列的值求和?