Вот ответ с использованием dplyr.
library(dplyr)
Воссоздание ваших данных:
data <- tibble(
product_id = rep(c("abc1", "abc2"), each = 3),
FYWeek = rep(c(20, 22), each = 3),
Launch_Week = rep(c(30, 28), each = 3),
Week = c(21, 31, 32, 25, 29, 26),
Sale = c(453, 408, 473, 466, 473, 412)
)
Откажитесь от строк, не соответствующих вашим условиям, и получите среднее значение Sale
оставшихся строк:
data %>%
filter(Week < FYWeek | Week > Launch_Week) %>%
mutate(avg = mean(Sale))
# A tibble: 3 x 6
product_id FYWeek Launch_Week Week Sale avg
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 abc1 20 30 31 408 451.
2 abc1 20 30 32 473 451.
3 abc2 22 28 29 473 451.