Ответ 1
Здесь решение в базе R с использованием ave
и 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
. Значения были бы правильными, но это было бы менее полезно.
Здесь 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