У меня есть данные, которые выглядят следующим образом:
df <- tibble(
date= seq.Date(as.Date("2021-01-01"), as.Date("2022-02-01"), by = "month"),
val1 = c(100, 100, 105, 125, 125, 125, 125, 132, 132, 132, 135, 150, 150, 150),
val2 = c(100, 100, 100, 125, 125, 125, 125, 125, 125, 125, 125, 150, 150, 150),
diff = val1-val2)
date val1 val2 diff
<date> <dbl> <dbl> <dbl>
1 2021-01-01 100 100 0
2 2021-02-01 100 100 0
3 2021-03-01 105 100 5
4 2021-04-01 125 125 0
5 2021-05-01 125 125 0
6 2021-06-01 125 125 0
7 2021-07-01 125 125 0
8 2021-08-01 132 125 7
9 2021-09-01 132 125 7
10 2021-10-01 132 125 7
11 2021-11-01 135 125 10
12 2021-12-01 150 150 0
13 2022-01-01 150 150 0
14 2022-02-01 150 150 0
Я пытаюсь получить следующий результат:
output <- tibble(
date= seq.Date(as.Date("2021-01-01"), as.Date("2022-02-01"), by = "month"),
val1 = c(100, 100, 105, 125, 125, 125, 125, 132, 132, 132, 135, 150, 150, 150),
val2 = c(100, 100, 100, 125, 125, 125, 125, 125, 125, 125, 125, 150, 150, 150),
diff = val1-val2,
diff_calc = c(0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 15, 15, 15))
date val1 val2 diff diff_calc
<date> <dbl> <dbl> <dbl> <dbl>
1 2021-01-01 100 100 0 0
2 2021-02-01 100 100 0 0
3 2021-03-01 105 100 5 0
4 2021-04-01 125 125 0 5
5 2021-05-01 125 125 0 5
6 2021-06-01 125 125 0 5
7 2021-07-01 125 125 0 5
8 2021-08-01 132 125 7 5
9 2021-09-01 132 125 7 5
10 2021-10-01 132 125 7 5
11 2021-11-01 135 125 10 5
12 2021-12-01 150 150 0 15
13 2022-01-01 150 150 0 15
14 2022-02-01 150 150 0 15
Где diff_calc — совокупная сумма предыдущих уникальных значений в diff, если только несколько уникальных значений diff не встречаются последовательно, тогда это должно быть наибольшее значение плюс совокупная сумма любого из предыдущих значений diff с использованием той же логики.
Это производное от этого вопроса, который я задавал ранее, но понял, что не предоставил лучший пример или описание, чтобы разместить здесь то, что мне нужно, поэтому публикую как новый вопрос. Спасибо!
@LTyrone Я исправил это сейчас, вы правы, что пятерку нужно было выполнить.





Два (похожих) варианта:
Вариант 1: наибольшее значение в diff, не обязательно последнее значение.
library(dplyr)
output |>
group_by(val2) |>
mutate(tmp = max(diff),
tmp = replace(tmp, 1:n()-1, 0)) |>
ungroup() |>
mutate(diff_calc = lag(cumsum(tmp), default = 0)) |>
select(-tmp)
# # A tibble: 14 × 5
# date val1 val2 diff diff_calc
# <date> <dbl> <dbl> <dbl> <dbl>
# 1 2021-01-01 100 100 0 0
# 2 2021-02-01 100 100 0 0
# 3 2021-03-01 105 100 5 0
# 4 2021-04-01 125 125 0 5
# 5 2021-05-01 125 125 0 5
# 6 2021-06-01 125 125 0 5
# 7 2021-07-01 125 125 0 5
# 8 2021-08-01 132 125 7 5
# 9 2021-09-01 132 125 7 5
# 10 2021-10-01 132 125 7 5
# 11 2021-11-01 135 125 10 5
# 12 2021-12-01 150 150 0 15
# 13 2022-01-01 150 150 0 15
# 14 2022-02-01 150 150 0 15
Вариант 2: последнее значение в diff для группы var2 всегда самое большое.
output |>
group_by(val2) |>
mutate(tmp = last(diff),
tmp = replace(tmp, 1:n()-1, 0)) |>
ungroup() |>
mutate(diff_calc = lag(cumsum(tmp), default = 0)) |>
select(-tmp)
@costebk08 — только что обновил его, добавив еще один параметр, на случай, если наибольшее значение всегда будет последним значением в группе.
@L Тайрон Ненавижу это говорить, но я понимаю, что это решение не учитывает все сценарии. В частности, предыдущие значения diff должны начинать накапливаться (то есть кумулятивно суммироваться) только после того, как разница равна 0. Другими словами, когда и val1, и val2 увеличиваются одинаково и сохраняют уже существующее diff, ничего суммировать не следует.
Удалось исправить с помощью ведущего столбца для различий и случая, когда оператор. Еще раз спасибо!
Из вашего описания неясно, почему за 15 следуют ненулевые значения, а за 5 — нет?