向下填充滞后值 R

Fill Lagged Values Down R

我正在尝试结合使用条件滞后,然后按组向下填充值。在我的数据中,我有 old_price 和 new_price。 new_price 必须始终低于 old_price。每当 new_price 大于 old_price 时,我想回溯到 new_price 小于 old_price 的最新值。在 Raleigh 的情况下,第 2 行和第 3 行应该滞后到 36.00。第 4 行不应滞后,因为 new_price 已经低于 old_price。当我尝试使用滞后时,它一直将其应用于第 2 行(价格为 52),但随后将第 3 行保留为 54.00。我希望第 3 行也落后于第 1 行,或者在具有正确值后落后于第 2 行。

这是我的数据:

city          sku  month  year  old_price   new_price
Raleigh       001  Dec    2021  45.00        36.00
Raleigh       001  Jan    2022  45.00        52.00
Raleigh       001  Feb    2022  45.00        54.00
Raleigh       001  Mar    2022  45.00        37.00
Austin        002  Dec    2021  37.50        30.00
Austin        002  Jan    2022  37.50        32.00
Austin        002  Feb    2022  37.50        48.00

期望的输出:

city          sku  month  year  old_price   new_price 
Raleigh       001  Dec    2021  45.00        36.00
Raleigh       001  Jan    2022  45.00        36.00
Raleigh       001  Feb    2022  45.00        36.00
Raleigh       001  Mar    2022  45.00        37.00
Austin        002  Dec    2021  37.50        30.00
Austin        002  Jan    2022  37.50        32.00
Austin        002  Feb    2022  37.50        32.00

一种方法是将 new_price > old_price 的值转换为 NA 然后向下填充。

library(dplyr)
library(tidyr)

df %>% 
  mutate(new_price = if_else(new_price > old_price, NA_real_, new_price)) %>% 
  fill(new_price)

输出:

     city sku month year old_price new_price
1 Raleigh   1   Dec 2021      45.0        36
2 Raleigh   1   Jan 2022      45.0        36
3 Raleigh   1   Feb 2022      45.0        36
4 Raleigh   1   Mar 2022      45.0        37
5  Austin   2   Dec 2021      37.5        30
6  Austin   2   Jan 2022      37.5        32
7  Austin   2   Feb 2022      37.5        32

数据:

df <- read.table(textConnection("city          sku  month  year  old_price   new_price
Raleigh       001  Dec    2021  45.00        36.00
Raleigh       001  Jan    2022  45.00        52.00
Raleigh       001  Feb    2022  45.00        54.00
Raleigh       001  Mar    2022  45.00        37.00
Austin        002  Dec    2021  37.50        30.00
Austin        002  Jan    2022  37.50        32.00
Austin        002  Feb    2022  37.50        48.00"), header = TRUE)