我有如下数据:

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

我正在try 生成以下输出:

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_calcdiff中之前唯一值的累积和,除非多个唯一diff值连续出现,否则它应该是最大值加上使用相同逻辑的任何之前diff值的累积和.

这是我之前询问的this question的派生,但我意识到我没有提供最好的例子或描述来满足我在这里需要的内容,所以作为新问题发布.谢谢!

推荐答案

两种 Select :

Option 1:差异中最大的值不一定是最后一个值

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

Option 2:每个var 2组差异的最后一个值始终最大

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)

R相关问答推荐

确定邻国

在交互式情节中从barplot中获取值时遇到问题,在shinly中的ggplotly

如何在x轴下方画一条带有箭头的线?

如何创建具有总计列和ggplot 2所有条线的百分比标签的堆叠条形图?

提取rame中对应r中某个变量的n个最小正值和n个最大负值的条目

有没有方法将琴弦完全捕捉到R中的多边形?

基于R中的GPS点用方向箭头替换点

如何替换R中数据集列中的各种字符串

Tidyverse/Djirr为从嵌套列表中提取的列名赋值的解决方案

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

ggplot2中的X轴显示数值,单位为百,而不是十

RStudio中相关数据的分组箱形图

将多列合并为单独的名称—值对

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

R中边际效应包中Logistic回归的交互作用风险比

方法::slotName如何处理非类、非字符的参数?

根据1个变量绘制 colored颜色 发散的 map ,由另一个变量绘制饱和度,ggplot2不工作

使用RSelenium在R中抓取Reddit时捕获多个标签

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

如何在反曲线图中更改X标签