Запаздывающая сперма в R

У меня есть данные, которые выглядят следующим образом:

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 с использованием той же логики.

Это производное от этого вопроса, который я задавал ранее, но понял, что не предоставил лучший пример или описание, чтобы разместить здесь то, что мне нужно, поэтому публикую как новый вопрос. Спасибо!

Из вашего описания неясно, почему за 15 следуют ненулевые значения, а за 5 — нет?

L Tyrone 08.05.2024 01:25

@LTyrone Я исправил это сейчас, вы правы, что пятерку нужно было выполнить.

costebk08 08.05.2024 04:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Два (похожих) варианта:

Вариант 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 Tyrone 08.05.2024 05:11

@L Тайрон Ненавижу это говорить, но я понимаю, что это решение не учитывает все сценарии. В частности, предыдущие значения diff должны начинать накапливаться (то есть кумулятивно суммироваться) только после того, как разница равна 0. Другими словами, когда и val1, и val2 увеличиваются одинаково и сохраняют уже существующее diff, ничего суммировать не следует.

costebk08 08.05.2024 21:18

Удалось исправить с помощью ведущего столбца для различий и случая, когда оператор. Еще раз спасибо!

costebk08 08.05.2024 21:46

Другие вопросы по теме