You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:00:36