基于现有日期列生成新列的R代码报错问题求解
问题解决:R代码生成日期分类列的错误修复
问题根源
- 类型不兼容:你的
df$Date ouverture是POSIXt(带时间戳的日期)类型,而定义的boundaries是Date(仅日期)类型,两种类型直接进行>=比较时,会触发方法不兼容的警告,同时导致比较逻辑异常。 - 区间判断逻辑漏洞:原
case_when的条件未明确区间上下限,且边界值顺序与条件描述不匹配,进一步加剧了结果错误。
修复步骤与代码
步骤1:统一日期类型
先将POSIXt类型的Date ouverture转换为Date类型(去掉时间部分,避免类型冲突):
df$`Date ouverture` <- as.Date(df$`Date ouverture`)
步骤2:修正区间判断逻辑
可以选择两种方式实现:
方式一:修正case_when逻辑
明确每个区间的上下限,确保case_when按从近到远的顺序匹配:
# 定义时间边界 boundaries <- list( within_1y = Sys.Date() - 365, within_2y = Sys.Date() - 2 * 365, within_3y = Sys.Date() - 3 * 365, within_5y = Sys.Date() - 5 * 365 ) # 生成分类列 df$DateCategory <- case_when( df$`Date ouverture` >= boundaries$within_1y ~ "< 1 year", df$`Date ouverture` >= boundaries$within_2y & df$`Date ouverture` < boundaries$within_1y ~ "> 1 year & < 2 years", df$`Date ouverture` >= boundaries$within_3y & df$`Date ouverture` < boundaries$within_2y ~ "> 2 years & < 3 years", df$`Date ouverture` >= boundaries$within_5y & df$`Date ouverture` < boundaries$within_3y ~ "> 3 years & < 5 years", TRUE ~ "> 5 years" )
方式二:用cut函数简化实现(更高效)
cut函数专门用于区间划分,代码更简洁且不易出错:
df$DateCategory <- cut( x = df$`Date ouverture`, breaks = c(Sys.Date() - 5*365, Sys.Date() - 3*365, Sys.Date() - 2*365, Sys.Date() - 365, Sys.Date()), labels = c("> 5 years", "> 3 years & < 5 years", "> 2 years & < 3 years", "> 1 year & < 2 years", "< 1 year"), include.lowest = TRUE # 包含最左侧的边界值 )
原代码只返回"< 1 year"的原因
类型不兼容导致POSIXt与Date的比较逻辑失效,所有比较结果被错误判定为TRUE,因此case_when会优先匹配第一个条件并返回对应结果。
内容的提问来源于stack exchange,提问作者user21699241
相关产品推荐
相关产品推荐

