Совокупный итог по группам

r data.table

2365 просмотра

4 ответа

Для следующего набора данных:

d = data.frame(date = as.Date(as.Date('2015-01-01'):as.Date('2015-04-10'), origin = "1970-01-01"),
               group = rep(c('A','B','C','D'), 25), value = sample(1:100))
head(d)
         date group value
1: 2015-01-01     A     4
2: 2015-01-02     B    32
3: 2015-01-03     C    46
4: 2015-01-04     D    40
5: 2015-01-05     A    93
6: 2015-01-06     B    10

.. кто-нибудь может посоветовать более элегантный способ вычисления совокупной суммы значений по группам, чем метод data.table )?

library(data.table)
setDT(d)
d.cast = dcast.data.table(d, group ~ date, value.var = 'value', fun.aggregate = sum)
c.sum = d.cast[, as.list(cumsum(unlist(.SD))), by = group]

... который довольно неуклюжий и дает плоскую матрицу, которую нужно dplyr::gatherили reshape2::meltпереформатировать.

Конечно, R может сделать лучше, чем это?

Автор: geotheory Источник Размещён: 12.11.2019 09:40

Ответы (4)


8 плюса

Решение

Если вы просто хотите накапливать суммы на группу, то вы можете сделать

transform(d, new=ave(value,group,FUN=cumsum))

с основанием R.

Автор: MrFlick Размещён: 22.05.2015 03:04

4 плюса

Это должно работать

library(dplyr)
d %>% 
  group_by(group) %>% 
  arrange(date) %>% 
  mutate(Total = cumsum(value))
Автор: Akhil Nair Размещён: 22.05.2015 03:07

3 плюса

Поскольку этот вопрос был помечен data.table, вы, вероятно, ищете (модификация комментария @Franks).

setDT(d)[order(date), new := cumsum(value), by = group]

Это будет одновременно переставлять данные date(не уверен, если нужно, если нет, вы можете избавиться от order(date)) и обновлять ваш набор данных на месте с использованием :=оператора

Автор: David Arenburg Размещён: 22.05.2015 03:23

0 плюса

Это оно?

sp <- split(d, d$group)
res <- lapply(seq_along(sp), function(i) cumsum(sp[[i]]$value))
res <- lapply(seq_along(res), function(i){
        sp[[i]]$c.sum <- res[[i]]
        sp[[i]]
    }) 
res <- do.call(rbind, res)
res
Автор: Rui Barradas Размещён: 05.07.2017 07:47
Вопросы из категории :
32x32