求助:使用dplyr连接数据集并通过日期区间生成pro_sales列出错
解决日期区间匹配时
pro_sales全为1的问题 你遇到的问题核心是逻辑运算符用错了——你在case_when里用了|(逻辑或),这会导致只要满足Date>=StartDate或者Date<=EndDate其中一个条件就返回1,而我们需要的是Date同时处于StartDate和EndDate之间,所以应该用&(逻辑且)。
修正后的代码
首先确认你的原始数据处理是正确的,然后修改判断逻辑:
library(dplyr) # 原始数据(已正确转换日期格式) data1=data.frame(Date=as.Date("2015-06-28"),Storecode=34) data2=data.frame(Promo=c("Promo1","Promo2","Promo3","Promo4") , StartDate=c("2015-02-10","2015-03-15","2015-05-24","2015-06-21") , EndDate=c("2015-02-17","2015-03-22","2015-06-01","2015-06-28")) data1$Date <- as.Date(data1$Date) data2$StartDate <- as.Date(data2$StartDate) data2$EndDate <- as.Date(data2$EndDate) # 修正逻辑后的处理代码 result <- data1 %>% mutate(dummy = TRUE) %>% left_join(data2 %>% mutate(dummy = TRUE)) %>% mutate(pro_sales = case_when( # 关键:用&同时满足两个区间条件 Date >= StartDate & Date <= EndDate ~ 1, # 其他情况赋值0,用TRUE更简洁 TRUE ~ 0 )) %>% select(-dummy) # 移除临时的dummy辅助列 print(result)
更简洁的写法(推荐)
你可以用dplyr的between()函数替代手动的区间判断,代码更易读:
result <- data1 %>% mutate(dummy = TRUE) %>% left_join(data2 %>% mutate(dummy = TRUE)) %>% mutate(pro_sales = if_else(between(Date, StartDate, EndDate), 1, 0)) %>% select(-dummy)
为什么原来的代码出错?
举个例子看Promo1的情况:你的Date是2015-06-28,StartDate是2015-02-10,EndDate是2015-02-17。此时Date>=StartDate是TRUE,Date<=EndDate是FALSE,用|(或)运算后结果为TRUE,所以被赋值1。而我们需要的是两个条件同时成立,所以必须用&(且)。
最终输出结果
运行修正后的代码,就能得到你期望的数据集:
Date Storecode Promo StartDate EndDate pro_sales 1 2015-06-28 34 Promo1 2015-02-10 2015-02-17 0 2 2015-06-28 34 Promo2 2015-03-15 2015-03-22 0 3 2015-06-28 34 Promo3 2015-05-24 2015-06-01 0 4 2015-06-28 34 Promo4 2015-06-21 2015-06-28 1
内容的提问来源于stack exchange,提问作者melik
相关产品推荐
相关产品推荐

