仅当数量不再增加时才按组汇总减少

Summarize decreases by group only when number does not increase again

我正在尝试计算在给定 year 的市场上从水果摊 (plots) 丢失的 applespears 的数量。在这里,损失将被定义为当苹果或梨的数量减少但保持在该数量并且在那一年该地块中不再增加时。换句话说,一个苹果或梨可能会从情节中丢失,但如果添加另一个(例如重新进货),则这不构成“损失”。我希望按年份、年份和地块总结丢失的苹果数量和丢失的梨数量。日期顺序在这里很重要(即从未来的日期到过去的日期不会发生损失),但我已经按年份对数据集进行了排序,所以这应该不是问题。

以下是数据示例:

table <- "date year plot apples pears
1  2021-05-26 2020   a    1      1
2  2021-05-27 2020   a    1      1
3  2021-05-28 2020   a    0      1
4  2021-05-29 2020   a    1      1
5  2021-05-30 2020   a    1      1
6  2021-05-27 2021   b    2      1
7  2021-05-28 2021   b    2      1
8  2021-05-29 2021   b    1      0
9  2021-05-30 2021   b    1      0
10 2021-05-31 2021   b    1      0
11 2021-05-27 2021   c    1      0
12 2021-05-28 2021   c    1      1
13 2021-05-29 2021   c    0      1
14 2021-05-30 2021   c    0      1
15 2021-05-31 2021   c    0      1"

基于此示例,您会期望:

  1. 2020年没有丢苹果也没有丢梨(这个数字确实 不减少并保持在那个减少的数字)。
  2. 2021年丢了2个苹果(1个b地块,1个c地块),1个梨子(b地块)

作为输出看起来类似于按年份总结的:

table <- "date year apples.lost pears.lost
1  2020   0      0
2  2021   2      1"

或者这个如果也按情节分组:

table <- "date year plot apples.lost pears.lost
1  2020   a    0      0
2  2021   b    1      1
3  2021   c    1      0"

我花了几个小时试图弄清楚如何做到这一点,但我无法想出可行的代码。我可以根据 等资源计算数据集中的 increases/decreases,但我似乎无法找到一种方法来计算仅在该特定年份的剩余时间内保持在该数字的减少量剧情.

使用 dplyr 包:

library(dplyr)

df %>%
  group_by(year, plot) %>%
  summarise(apples.lost = max(first(apples) - last(apples), 0),
            pears.lost = max(first(pears) - last(pears), 0)) %>%
  ungroup()

#> # A tibble: 3 x 4
#>    year plot  apples.lost pears.lost
#>   <dbl> <chr>       <dbl>      <dbl>
#> 1  2020 a               1          0
#> 2  2021 b               1          1
#> 3  2021 c               1          0

要获得每年的总和,您需要再次汇总:

df %>% 
  group_by(year, plot) %>%
  summarise(apples.lost = max(first(apples) - last(apples), 0),
            pears.lost = max(first(pears) - last(pears), 0)) %>%
  group_by(year) %>%
  summarise(apples.lost = sum(apples.lost),
            pears.lost = sum(pears.lost))

#> # A tibble: 2 x 3
#>    year apples.lost pears.lost
#>   <dbl>       <dbl>      <dbl>
#> 1  2020           1          0
#> 2  2021           2          1

一个data.table解决方案:

  library(data.table)
  
  dt <- fread(text = "obs date year plot apples pears
1  2021-05-26 2020   a    1      1
2  2021-05-27 2020   a    1      1
3  2021-05-28 2020   a    0      1
4  2021-05-29 2020   a    1      1
5  2021-05-30 2020   a    1      1
6  2021-05-27 2021   b    2      1
7  2021-05-28 2021   b    2      1
8  2021-05-29 2021   b    1      0
9  2021-05-30 2021   b    1      0
10 2021-05-31 2021   b    1      0
11 2021-05-27 2021   c    1      0
12 2021-05-28 2021   c    1      1
13 2021-05-29 2021   c    0      1
14 2021-05-30 2021   c    0      1
15 2021-05-31 2021   c    0      1")
  
  dt[, .(apples.lost = max(0L, first(apples) - last(apples)), pears.lost = max(0L, first(pears) - last(pears))), by = year:plot]
#>    year plot apples.lost pears.lost
#> 1: 2020    a           0          0
#> 2: 2021    b           1          1
#> 3: 2021    c           1          0