Суммируйте значения в одном столбце на основе группировки и индекса - PullRequest
0 голосов
/ 19 июня 2020

Я хочу суммировать значение на основе индекса и группировки. Это набор данных моей игрушки:

vals<- 1:5 
grps <- c(1,1,2,2,2)
dts <- as.Date(c("2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-05"))
dfx <- as_tibble(cbind(vals,grps,dts))
colnames(dfx) <- c("vals","grps","dts")
(rslt <- dfx %>% 
  mutate(dts = as.Date(dts)) %>%
  arrange(dts) %>%
  group_by(grps) %>%
  mutate(dist = as.numeric(last(dts) - dts)))

Результирующий df выглядит так:

   vals  grps dts         dist
  <dbl> <dbl> <date>     <dbl>
1     1     1 2020-01-01     1
2     2     1 2020-01-02     0
3     3     2 2020-01-03     2
4     4     2 2020-01-04     1
5     5     2 2020-01-05     0

Я хотел бы получить новую переменную для каждой строки (например, через mutate () ), который представляет собой сводку всех дней в каждой группе ( grps ) для каждой строки, меньшей или такой же, как значение, указанное в индексе ( dist ). Другими словами, я хотел бы получить сводные данные о значениях ( vals ) для каждого дневного интервала до определенного крайнего срока, включая группировку.

Итак, мой желаемый конечный результат будет столбец в моем df ( сумма ):

# A tibble: 5 x 5
# Groups:   grps [2]
   vals  grps dts         dist   sum
  <dbl> <dbl> <date>     <dbl> <dbl>
1     1     1 2020-01-01     1     3
2     2     1 2020-01-02     0     2
3     3     2 2020-01-03     2    12
4     4     2 2020-01-04     1     9
5     5     2 2020-01-05     0     5

1 Ответ

1 голос
/ 19 июня 2020

Вы можете arrange данные по dist и взять cumsum для каждого grps.

library(dplyr)

rslt %>%
  arrange(grps, dist) %>%
  group_by(grps) %>%
  mutate(sum = cumsum(vals))

#   vals  grps dts         dist   sum
#  <dbl> <dbl> <date>     <dbl> <dbl>
#1     2     1 2020-01-02     0     2
#2     1     1 2020-01-01     1     3
#3     5     2 2020-01-05     0     5
#4     4     2 2020-01-04     1     9
#5     3     2 2020-01-03     2    12
...