【发布时间】:2016-12-04 07:35:56
【问题描述】:
假设我有两个数据集。一个包含带有开始/结束日期的促销列表,另一个包含每个程序的月度销售数据。
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有关?
【问题讨论】:
-
能否添加所需的输出数据框?我不太了解您的循环的输出。此外,如果您对每个程序每月的促销次数感兴趣,为什么需要销售数据框?
-
我已经编辑了帖子以包含我的循环的输出。该循环将“计数”列添加到原始销售 data.frame。
-
对于我的分析,我需要每个程序的销售额和每月促销次数,所以是的,销售额 data.frame 是必要的。
标签: r performance for-loop dplyr