这是在 R 基础上使用的解决方案ave
and within
:
within(mydf, {
cumsumProduct <- ave(product, level1, level2, FUN = cumsum)
})
# level1 level2 hour product cumsumProduct
# 1 A tea 0 7 7
# 2 A tea 1 2 9
# 3 A tea 2 9 18
# 4 A coffee 17 7 7
# 5 A coffee 18 2 9
# 6 A coffee 20 4 13
# 7 B coffee 0 2 2
# 8 B coffee 1 3 5
# 9 B coffee 2 4 9
# 10 B tea 21 3 3
# 11 B tea 22 1 4
当然,如果您想删除现有的产品列,可以将命令更改为以下内容以覆盖当前的“产品”列:
within(mydf, {
product <- ave(product, level1, level2, FUN = cumsum)
})
您当前的方法部分不起作用,因为您已将“小时”作为分组变量之一。换句话说,它认为“A + tea + 0”的组合与“A + tea + 1”不同,但从您期望的输出来看,您似乎只是希望“A + tea”的组合成为团体。
aggregate
不会像你期望的那样工作,因为它会将所有内容压缩成一个data.frame
行数与“level1”和“level2”的唯一组合的数量相同,在本例中为 4 行。聚合列将是list
。这些值是正确的,但用处不大。
Here's aggregate
及其输出:
> aggregate(product ~ level1 + level2, mydf, cumsum)
level1 level2 product
1 A coffee 7, 9, 13
2 B coffee 2, 5, 9
3 A tea 7, 9, 18
4 B tea 3, 4