Один из способов решить эту проблему - использовать complete
(из tidyr
) с group_by
, mutate
и summarize
(из dplyr
), а также cumsum
, а не sum
( база R
).
Поскольку данные, которые вы предоставляете, едва совпадают с желаемым интервалом, я немного изменил интервал, чтобы показать, как он работает. Конечно, это абсолютно гибко, и вы можете использовать любой интервал, который хотите иметь:
library(dplyr)
library(tidyr)
my.dat <- seq(as.Date("2013-03-01"), as.Date("2014-04-01"), by = "month")
new.df <- my.df %>%
complete(company_name, yearMonth = my.dat, fill = list(raised_amount_usd = 0)) %>%
group_by(company_name, yearMonth) %>%
summarize(raised_amount_usd = sum(raised_amount_usd, na.rm = TRUE)) %>%
arrange(yearMonth) %>%
mutate(cumulative_raised = cumsum(raised_amount_usd)) %>%
select(company_name, yearMonth, cumulative_raised)
tail(new.df, 10)
# A tibble: 10 x 3
# Groups: company_name [4]
company_name yearMonth cumulative_raised
<chr> <date> <dbl>
1 01Games Technology 2014-02-01 0
2 H2O.ai 2014-02-01 4700000
3 0-6.com 2014-03-01 0
4 004 Technologies 2014-03-01 0
5 01Games Technology 2014-03-01 41250
6 H2O.ai 2014-03-01 4700000
7 0-6.com 2014-04-01 0
8 004 Technologies 2014-04-01 0
9 01Games Technology 2014-04-01 41250
10 H2O.ai 2014-04-01 4700000
Как это работает?
Сначала, с помощью complete
мы заполняем пропущенные даты в столбце yearMonth
и исключаем те, которые не входят в указанный временной интервал. Затем с помощью group_by
мы формируем группы company_name
и yearMonth
, а затем summarize
raised_amount_usd
для каждой даты и компании (чтобы сложить сумму, которая была собрана в тот же день, что и для H2O.ai в 2013 году -03-01). Затем мы упорядочиваем данные по yearMonth
и вычисляем накопленную сумму. Данные по-прежнему сгруппированы по company_name
и, таким образом, рассчитывается совокупная сумма на компанию. Наконец, мы выбираем только те столбцы, которые вас заинтересовали.
Данные
my.df <-
structure(list(company_name = c("0-6.com", "004 Technologies", "01Games Technology", "H2O.ai", "H2O.ai", "H2O.ai"),
funding_round_type = c("venture", "venture", "undisclosed", "venture", "seed", "venture"),
funding_round_code = c("A", " ", " ", "B", " ", " "),
funded_at = structure(c(13957, 16275, 16252, 16748, 15847, 15708), class = "Date"),
raised_amount_usd = c(2000000L, NA, 41250L, 20000000L, 3000000L, 1700000L),
yearMonth = structure(c(13939, 16130, 16130, 16495, 15765, 15765), class = "Date")),
class = "data.frame", row.names = c(NA, -6L))