请求指导:针对字符型日期列DOB使用case_when的正确代码写法
字符型日期列的case_when正确处理写法
原代码存在两个核心问题:
- 字符型日期无法直接通过字符串比较得到正确的日期逻辑(字符串按字符顺序比对,和实际日期逻辑不符)
- 条件表达式写法错误,
DOB %in% '1/1/1945' > '31/12/1967'完全不符合区间判断的语法逻辑
正确写法步骤:
- 先将字符型日期转换为R可识别的日期类型(推荐用lubridate包的日期解析函数,适配日/月/年格式)
- 在
case_when中使用日期类型进行区间判断
代码示例(保留转换后的日期列):
library(dplyr) library(lubridate) data1 %>% mutate( # 把字符型DOB转为日期型,适配日/月/年格式 DOB_date = dmy(DOB), generation = case_when( # 判断出生日期在1945-01-01至1967-12-31之间 DOB_date >= dmy("1/1/1945") & DOB_date <= dmy("31/12/1967") ~ "baby_boomers", # 其他所有情况 TRUE ~ "else" ) )
简化写法(直接在判断中转换,不新增列):
library(dplyr) library(lubridate) data1 %>% mutate(generation = case_when( dmy(DOB) >= dmy("1/1/1945") & dmy(DOB) <= dmy("31/12/1967") ~ "baby_boomers", TRUE ~ "else" ))
注意事项:
- 如果你的日期格式是月/日/年,将
dmy()替换为mdy()即可 - 确保已安装并加载
lubridate包,若未安装可先运行install.packages("lubridate")
内容的提问来源于stack exchange,提问作者Sultan of swing
相关产品推荐
相关产品推荐

