假設我有兩個數據集。其中一個包含開始/結束日期的促銷清單,另一個包含每個程序的月度銷售數據。按日期範圍和分類變量組合數據集
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
用於表示年/月。 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
我編輯了帖子以包含我的循環的輸出。該循環將「計數」列添加到原始銷售數據框架。 – heo
對於我的分析,我需要每個程序的銷售額和每月促銷數量,所以是的,銷售數據框是必要的。 – heo