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

R语言使用mutate/ifelse处理日期条件生成数值列结果异常求助

问题排查与解决

核心问题原因

  1. 日期解析错误:你写的2023-08-03在R中会被当作数值运算(2023-8-3=2012),而非日期类型。而Program.Start.Date作为日期列,转成数值后是从1970年1月1日开始的天数(比如2023-08-03对应的数值约为19564),远大于2012,因此所有日期都会满足>=2012的条件,导致返回1。
  2. 逻辑条件错误:原代码中使用|(或)连接>=A和<=B,如果A早于B(比如8月3日早于11月30日),任何日期都会满足这个条件——日期在A之前会符合<=B,在B之后会符合>=A,中间的日期两个条件都符合,因此所有行返回1。

修正方案

根据你的需求(仅约半数数据符合返回1的条件),推测你是想标记**2023-08-03至2023-11-30之间(含边界)**的日期为1,否则为0,修正后的代码如下:

方法1:使用ifelse+正确日期比较

library(dplyr)
library(lubridate)

DF %>% 
  mutate(g = ifelse(Program.Start.Date >= ymd("2023-08-03") & Program.Start.Date <= ymd("2023-11-30"), 1, 0))

方法2:使用between函数更简洁

DF %>% 
  mutate(g = as.integer(between(Program.Start.Date, ymd("2023-08-03"), ymd("2023-11-30"))))

如果你的需求是标记该区间之外的日期为1,只需调整逻辑:

DF %>% 
  mutate(g = ifelse(Program.Start.Date < ymd("2023-08-03") | Program.Start.Date > ymd("2023-11-30"), 1, 0))

关键注意点

  • 日期必须用字符串形式(加引号),并用ymd()(lubridate包)或as.Date()转换为日期类型,确保和Program.Start.Date的类型一致后再比较。
  • 根据实际需求选择逻辑运算符:&(且)用于同时满足两个条件,|(或)用于满足任一条件。

内容的提问来源于stack exchange,提问作者alecandia84

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:50:16