【发布时间】:2018-09-05 14:45:34
【问题描述】:
我的目标是编写一个更高效的代码,创建一个日历,将经销商的客户分配到不同的日子,以便:
- 每天至少有
min客户和(min取决于经销商) - 所有日子每天最多有
max客户和(max取决于经销商) - 每当客户被转移到不同的日子时,他都应该被转移到可能的最近的那一天(不要担心关系 - 如果距离相同,那么前 1 天或后 1 天是相同的)李>
例子:
dealer_id <- rep(c("ABC123","DEF234","GHJ456"), each = 4)
date <- as.Date(rep(c("2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04"), times = 3))
cust_pos_1 <- c("MCA1", "MCA2", "MCA3", "MCA4", "MCA5", "MCA6", NA, NA, "MCA9", "MCA10", "MCA11", "MCA12")
cust_pos_2 <- c("MCB1", "MCB2", NA, NA, "MCB5", NA, NA, NA, "MCB9", NA, "MCB11", NA)
cust_pos_3 <- c("MCC1", "MCC2", NA, NA, NA, NA, NA, NA, "MCC9", NA, NA, NA)
df <- data.frame(dealer_id, date, cust_pos_1, cust_pos_2, cust_pos_3)
settings <- data.frame(dealer_id = c("ABC123","DEF234","GHJ456"), min_daily = c(2, 0, 1), max_daily = c(3, 1, 2))
为我们提供输入数据和经销商设置:
dealer_id date cust_pos_1 cust_pos_2 cust_pos_3
ABC123 2018-01-01 MCA1 MCB1 MCC1
ABC123 2018-01-02 MCA2 MCB2 MCC2
ABC123 2018-01-03 MCA3 NA NA
ABC123 2018-01-04 MCA4 NA NA
DEF234 2018-01-01 MCA5 MCB5 NA
DEF234 2018-01-02 MCA6 NA NA
DEF234 2018-01-03 NA NA NA
DEF234 2018-01-04 NA NA NA
GHJ456 2018-01-01 MCA9 MCB9 MCC9
GHJ456 2018-01-02 MCA10 NA NA
GHJ456 2018-01-03 MCA11 MCB11 NA
GHJ456 2018-01-04 MCA12 NA NA
dealer_id min_daily max_daily
ABC123 2 3
DEF234 0 1
GHJ456 1 2
代码运行后的输出数据应该是这样的:
dealer_id date cust_pos_1 cust_pos_2 cust_pos_3
ABC123 2018-01-01 MCA1 MCB1 NA
ABC123 2018-01-02 MCA2 MCB2 NA
ABC123 2018-01-03 MCA3 MCC1 NA
ABC123 2018-01-04 MCA4 MCC2 NA
DEF234 2018-01-01 MCA5 NA NA
DEF234 2018-01-02 MCA6 NA NA
DEF234 2018-01-03 MCB5 NA NA
DEF234 2018-01-04 NA NA NA
GHJ456 2018-01-01 MCA9 MCB9 NA
GHJ456 2018-01-02 MCA10 MCC9 NA
GHJ456 2018-01-03 MCA11 MCB11 NA
GHJ456 2018-01-04 MCA12 NA NA
由于设置 - 必须根据上述规则重新分配客户。
设置表也有规则! min 和 max 之间的差值始终为 1。
可以说有不止一种方法可以解决这个问题,因为我们不在乎客户是否在 x 天前或 x 天后移动,这意味着我们可以变得不同(而且更好! ) 解决方案。
现在。话虽如此,我已经使用一个需要很长时间才能运行的循环解决了这个问题(我的数据框很大——我必须为 150 个经销商和数百个客户创建这个日历 5 年)。
我的问题是:有没有办法使用 dplyr 或 data.table 或其他方法来加快运行速度?
谢谢。
【问题讨论】:
-
请分享您的工作代码并要求改进,而不是要求某人提供临时解决方案。
-
我不能真正分享代码,因为它很长。我应该重新表述问题以询问如何解决,还是应该分享代码的想法,人们可以对此发表评论?
-
根据设置,ABC123最多可以处理3个,那你为什么要下移MCC1和MCC2呢?
-
因为 ABC123 的最小值为 2。代码必须首先处理满足最小值,然后不违反最大值
标签: r performance dplyr data.table