R - функция или скрипт для заполнения фрейма данных накопительными частичными вычислениями (не суммой) - PullRequest
0 голосов
/ 30 октября 2019

Это довольно специфическая задача. Допустим, у меня есть эта таблица, подумайте о типичной банковской базе данных (кстати, работающей с data.table):

customer_id; month; balance
1;1;100
1;2;110
1;3;140
1;4;70

Мне нужен скрипт или функция, которая возвращает для каждой строки соотношение относительномаксимальный исторический баланс для каждого клиента.

customer_id; month; balance; ratio
1;1;100;1       # 1 because 100 balance is both the current datapoint and the max value so far
1;2;110;1.1     # 1.1 because 110 balance is 1.1 of the prior max value, 100
1;3;140;1.27    # 1.27 because it's 140 divided by the prior max value, 110
1;4;70;0.5      # 0.5 because it's 70 divided by the prior max value, 140

Я знаю, что некоторые методы dplyr или data.table могут работать с кумулятивными вычислениями, такими как cumsum. Однако у этого есть поворот, который я не могу найти в Интернете.

Спасибо.

1 Ответ

2 голосов
/ 30 октября 2019

Вы можете сделать это с помощью dplyr, используя cummax (совокупный максимум) и lag (для получения предыдущих значений) довольно легко

library(dplyr)
dd %>% 
  group_by(customer_id) %>% 
  mutate(ratio = balance/lag(cummax(balance), default=first(balance)))

#   customer_id month balance ratio
#         <int> <int>   <int> <dbl>
# 1           1     1     100  1   
# 2           1     2     110  1.1 
# 3           1     3     140  1.27
# 4           1     4      70  0.5 

, где

dd <- read.table(text="
customer_id; month; balance
1;1;100
1;2;110
1;3;140
1;4;70", sep=";", header=TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...