Предположим, у меня есть два набора данных. Один содержит список рекламных акций с датами начала и окончания, а другой содержит ежемесячные данные о продажах для каждой программы.Объединение наборов данных по диапазону дат и категориальной переменной
promotions = data.frame(
start.date = as.Date(c("2012-01-01", "2012-06-14", "2012-02-01", "2012-03-31", "2012-07-13")),
end.date = as.Date(c("2014-04-05", "2014-11-13", "2014-02-25", "2014-08-02", "2014-09-30")),
program = c("a", "a", "a", "b", "b"))
sales = data.frame(
year.month.day = as.Date(c("2013-02-01", "2014-09-01", "2013-08-01", "2013-04-01", "2012-11-01")),
program = c("a", "b", "a", "a", "b"),
monthly.sales = c(200, 200, 200, 400, 200))
Отметьте, что sales$year.month.day
используется, чтобы указать год/месяц. День включен, поэтому R может просто обрабатывать столбец как вектор объектов даты, но он не имеет отношения к фактическим продажам.
Мне нужно определить количество рекламных акций, которые произошли в месяц для каждой программы. Вот пример цикла, который производит выход, я хочу:
sales$count = rep(0, nrow(sales))
sub = list()
for (i in 1:nrow(sales)) {
sub[[i]] = promotions[which(promotions$program == sales$program[i]),]
if (nrow(sub[[i]]) > 1) {
for (j in 1:nrow(sub[[i]])) {
if (sales$year.month.day[i] %in% seq(from = as.Date(sub[[i]]$start.date[j]), to = as.Date(sub[[i]]$end.date[j]), by = "day")) {
sales$count[i] = sales$count[i] + 1
}
}
}
}
Пример вывода:
sales = data.frame(
year.month.day = as.Date(c("2013-02-01", "2014-09-01", "2013-08-01", "2013-04-01", "2012-11-01")),
program = c("a", "b", "a", "a", "b"),
monthly.sales = c(200, 200, 200, 400, 200),
count = c(3, 1, 3, 3, 2)
)
Однако, так как мои фактические наборы данных очень велик, этот цикл происходит сбой, когда я запускаю его в R.
Есть ли более эффективный способ достижения такого же результата? Может, что-то с dplyr?
Можете ли вы добавить желаемый кадр выходных данных? Я не понимаю выход вашего цикла. Также, если вас интересует количество рекламных акций в месяц для каждой программы, зачем вам нужен кадр данных о продажах? – thepule
Я отредактировал сообщение, чтобы включить вывод моего цикла. Цикл добавляет столбец «count» к исходному кадру данных. – heo
Для моего анализа мне нужны продажи и количество рекламных акций в месяц для каждой программы, так что да, необходим data data.frame. – heo