gpt4 book ai didi

r - 如何聚合数据框并为未找到的类别添加 0

转载 作者:行者123 更新时间:2023-12-02 03:10:19 25 4
gpt4 key购买 nike

我有一个像这样的数据框:

> prova
sent weeknumber processed
1 100 1 1
2 23 1 0
3 254 1 1
4 321 2 0
5 1241 2 0
6 323 2 1
7 1221 3 1

structure(list(sent = c(100, 23, 254, 321, 1241, 323, 1221),
weeknumber = c(1, 1, 1, 2, 2, 2, 3), processed = c(1, 0,
1, 0, 0, 1, 1)), .Names = c("sent", "weeknumber", "processed"
), row.names = c(NA, -7L), class = "data.frame")

如果我想为 processed = 0 的行提取按周数发送的数量,我可以这样做:

aggregate(prova[prova$processed==0,]$sent, by=list(prova[prova$processed==0,]$weeknumber), FUN = sum)
Group.1 x
1 1 23
2 2 1562

如果我想提取 Sent by week number when processed = 1 的总和,我会这样做:

aggregate(prova[prova$processed==1,]$sent, by=list(prova[prova$processed==1,]$weeknumber), FUN = sum)
Group.1 x
1 1 354
2 2 323
3 3 1221

但是,我想找到一种始终具有相同结果长度的方法,即在 processed=0 的情况下,如下所示:

  Group.1    x
1 1 23
2 2 1562
3 3 0 // this is the new row I'd like to add

如果我简单地传递可能周数的整个列表,我会得到:

aggregate(prova[prova$processed==0,]$sent, by=list(prova$weeknumber), FUN = sum)
Error in aggregate.data.frame(as.data.frame(x), ...) :
arguments must have same length

非常感谢任何提示/建议!

最佳答案

我们可以对 data.table 使用 if/else 条件。将 'data.frame' 转换为 'data.table' (setDT(prova)),按 'weeknumber' 分组,如果没有任何 code> 'processed' 中的 0 个值,返回 0 或 else 获取 'sent' 的 sum,其中 'processed' 为 0。

library(data.table)
setDT(prova)[, .(sent = if(!any(processed==0)) 0
else sum(sent[processed==0])), by = weeknumber]
# weeknumber sent
#1: 1 23
#2: 2 1562
#3: 3 0

但是,如果我们需要按“周数”分组的每个“已处理”值的“已发送”的总和,一个方便的选项是dcast

dcast(setDT(prova), weeknumber~processed, value.var="sent", sum)
# weeknumber 0 1
#1: 1 23 354
#2: 2 1562 323
#3: 3 0 1221

或者使用 base R 中的 xtabs,它还对“weeknumber”和“处理'。

xtabs(sent~weeknumber + processed, prova)

如果我们使用aggregate,一个选项是merge aggregate 的输出与unique 集合'weeknumber' 然后将 'sent' 中的 NA 元素替换为 0。

res <- merge(data.frame(weeknumber = unique(prova$weeknumber)), 
aggregate(sent~weeknumber, prova, subset = processed ==0, FUN = sum),
all.x=TRUE)
res$sent[is.na(res$sent)] <- 0
res
# weeknumber sent
#1 1 23
#2 2 1562
#3 3 0

关于r - 如何聚合数据框并为未找到的类别添加 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40364620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com