[R]: флаг перекрывающихся периодов времени - PullRequest
0 голосов
/ 03 октября 2018

Ниже на графике данных показан календарь продвижения для продуктов, то есть, с какой недели начинается продвижение, какие продукты продвигаются и как долго продвижение.

Мне нужна функция, которая создаст флаг (по PromoID и StartWk), указывающийесли дублируется комбинация Product-WeekNum, где WeekNum от (StartWk) до (StartWk + Duration).Таким образом, WeekNum для первого ряда - 5-я и 6-я недели (и так далее).По сути, если дублируется любая комбинация Product-WeekNum, то соответствующая комбинация PromoID-StartWk помечается.WeekNum отображается в виде комментариев R.

Если таких экземпляров нет, функция должна вывести пустой фрейм данных с полями вывода.

Очень желательно - пустой фрейм данных, переданный в функцию, должен создать пустой фрейм данныхс полями вывода.

Если это помогает, любой заданный PromoID всегда будет иметь одинаковый набор продуктов и одинаковую длительность во всех случаях.

df <- structure(list(PromoID = c("A", "A", "A", "A", "B", "B", "C", 
"C", "D", "A", "A", "E", "E"), Product = c("Flavored", "Original", 
"Flavored", "Original", "Flavored", "Original", "Flavored", "Original", 
"Flavored", "Flavored", "Original", "Energy", "Energy"), StartWk = c(5L, 
5L, 21L, 21L, 30L, 30L, 6L, 6L, 5L, 5L, 5L, 49L, 49L), Duration = c(2L, 
2L, 2L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 2L, 1L, 1L)), .Names = c("PromoID", 
"Product", "StartWk", "Duration"), class = "data.frame", row.names = c(NA, 
-13L))

   PromoID  Product StartWk Duration
1        A Flavored       5        2 # WeekNum 5, 6
2        A Original       5        2 # WeekNum 5, 6
3        A Flavored      21        2 # WeekNum 21, 22
4        A Original      21        2 # WeekNum 21, 22
5        B Flavored      30        3 # WeekNum 30, 31, 32
6        B Original      30        3 # WeekNum 30, 31, 32
7        C Flavored       6        1 # WeekNum 6
8        C Original       6        1 # WeekNum 6
9        D Flavored       5        2 # WeekNum 5, 6
10       A Flavored       5        2 # WeekNum 5, 6
11       A Original       5        2 # WeekNum 5, 6
12       E   Energy      49        1 # WeekNum 49
13       E   Energy      49        1 # WeekNum 49

Ожидаемый результат -

  PromoID StartWk Flag
1       A       5    1
2       C       6    1
3       D       5    1
4       E      49    1

1 Ответ

0 голосов
/ 03 октября 2018
df %>%
  # Make row for each week of each promotion
  tidyr::uncount(weights = Duration, .id = "wk_no") %>%
  # Show what week is represented by each row
  mutate(CurWk = StartWk + wk_no - 1) %>%
  # How many Promos are there for each product each week?
  add_count(Product, CurWk) %>%
  # Only include overlapping promos
  filter(n > 1) %>%

  # To shape into requested output form, only show one row per overlap
  group_by(PromoID, StartWk) %>%
  summarize(Flag = 1)

Выход

# A tibble: 4 x 3
# Groups:   PromoID [?]
  PromoID StartWk  Flag
  <chr>     <int> <dbl>
1 A             5     1
2 C             6     1
3 D             5     1
4 E            49     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...