R语言使用mutate/ifelse处理日期条件生成数值列结果异常求助
问题排查与解决
核心问题原因
- 日期解析错误:你写的
2023-08-03在R中会被当作数值运算(2023-8-3=2012),而非日期类型。而Program.Start.Date作为日期列,转成数值后是从1970年1月1日开始的天数(比如2023-08-03对应的数值约为19564),远大于2012,因此所有日期都会满足>=2012的条件,导致返回1。 - 逻辑条件错误:原代码中使用
|(或)连接>=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
相关产品推荐
相关产品推荐

