R dplyr - промежуточная сумма с построчными расчетами - PullRequest
1 голос
/ 19 марта 2020

У меня есть фрейм данных, который отслеживает действия, связанные с банковским счетом (пример ниже).

Начальный баланс составляет 5000 долларов США ( type"initial). Если type равен" in ", это означает депозит ca sh. В этом примере каждый депозит составляет $ 1000. Если type is out, это означает снятие средств со счета. В этом примере каждый вывод средств составляет 10% от остатка на счете.

data <- tibble(
  activity=1:6,
  type=c("initial","in","out","out","in","in"),
  input=c(5000,1000,10,10,1000,1000))

Есть ли dplyr Решение для отслеживания баланса после каждого действия? Я пробовал несколько способов, но я не могу найти способ эффективно рассчитать промежуточные итоги и сумму снятия (которая зависит от промежуточного итога) .

Для этого примера выходные данные должны быть:

result <- tibble(
  activity=1:6,
  type=c("initial","in","out","out","in","in"),
  input=c(5000,1000,10,10,1000,1000),
  balance=c(5000,6000,5400,4860,5860,6860))

Заранее благодарим за любые предложения или рекомендации!

1 Ответ

2 голосов
/ 19 марта 2020

Вы можете использовать purrr::accumulate2(), чтобы вычислить значение type:

library(dplyr)
library(purrr)
library(tidyr)

data %>%
  mutate(balance = accumulate2(input, type[-1], .f = function(x, y, type) if(type == "out") x - x * y/100 else x + y)) %>%
  unnest(balance) 

# A tibble: 6 x 4
  activity type    input balance
     <int> <chr>   <dbl>   <dbl>
1        1 initial  5000    5000
2        2 in       1000    6000
3        3 out        10    5400
4        4 out        10    4860
5        5 in       1000    5860
6        6 in       1000    6860
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...