Вкратце: мне нужно указать, была ли акция основана на падении (или нет) цены с течением времени или нет. Я открыт для альтернативных подходов.
У меня есть набор данных о ценах, разделенных по нескольким группирующим факторам с течением времени. Моя цель состоит в том, чтобы для каждого «ПУНКТА» в «КАЖДОМ» магазине проверить режим «ЦЕНА» за последние 7 дат (если они существуют). Если значение наблюдения составляет менее 10% от режима цены, то в столбце «Акция» следует поставить 1, если не 0.
ПРИМЕР ДАННЫХ
dat <- data.frame(Date = sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 10),
Item = rep(LETTERS[1:4], times = 10),
Store = as.factor(sample(rep(c("NY","SYD","LON","PAR"), each = 10))),
Price = rnorm(n = 40, mean = 2.5, sd = 1))
До сих пор я использовал group_split
dplyr, чтобы разбить элемент и сохранить группы в отдельные фреймы данных, чтобы зафиксировать все условия. Я считаю, что сейчас мне нужно сделать mutate
новый столбец, используя оператор ifelse
с rollapply
. До сих пор я пытался использовать следующую строку кода...
data %>% mutate(Promotion = ifelse(rollapply(Price, 7, Mode <= Price*0.91,1,0)))
это возвращает сообщение об ошибке...
Error: Problem with `mutate()` input `PRMT_IND2`.
x comparison (5) is possible only for atomic and list types
i Input `PRMT_IND2` is `ifelse(...)`.
Я не совсем уверен, куда идти отсюда. Если у вас есть время, я также был бы признателен, если бы вы могли рассказать мне, как применить это ко всем группам, созданным group_split, и как сшить это вместе.
Примечание. Наблюдения (даты/строки) неравномерны по магазинам, а некоторые заполнены менее чем за 7 дней. Я могу удалить их, если скользящее применение не будет работать без него. Но при этом теряется довольно много данных.
Я использую эту функцию для режима...
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
x <- c(2, 1, 3, 1, 2, 1)
вернет Mode как 1, потому что это встречается 3 раза.Price
в вашем наборе данных является числовым значением, и маловероятно, что какое-либо число будет встречаться несколько раз, поэтому я думаю, чтоMode
- неправильная функция. - person Ronak Shah   schedule 29.07.2020