如何聚合数据框并通过 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 中的重复行对列的值求和的主要内容,如果未能解决你的问题,请参考以下文章