R语言中基于日期分配孵化时段类别:代码运行无效果问题
问题分析与解决方案
核心问题
- 逻辑条件完全矛盾:你写的每个条件里,
<= 早日期和>= 晚日期不可能同时成立(比如<= "01/06"且>= "15/06",没有任何日期能满足),所以根本不会有数据被赋值。 - 字符型日期比较不可靠:直接用字符串比较日期会按字典序判断(比如
"10/06"会被认为比"01/07"大,因为第一个字符1>0),完全不符合实际日期的先后逻辑。 - 覆盖原始数据风险:直接修改
HatchingDay列会把原始日期覆盖,后续无法再使用这些日期数据,应该新建列存储分类结果。
修复步骤
1. 先将字符型日期转换为可比较的日期类型
因为你的日期没有年份,可以用一个虚拟闰年(比如2020,避免2月29日的问题)来转换:
# 转换为日期类型,添加虚拟年份2020 AllData$HatchDate <- as.Date(paste0("2020/", AllData$HatchingDay), format = "%Y/%d/%m")
2. 新建分类列,设置正确的区间条件
假设你想要的区间是(可根据实际需求调整日期):
- Early:6月15日 - 6月28日(14天)
- Middle:6月29日 - 7月12日(14天)
- Late:7月13日 - 7月26日(14天)
方式一:用dplyr的case_when(逻辑清晰,推荐)
library(dplyr) AllData <- AllData %>% mutate(HatchingPeriod = case_when( HatchDate >= as.Date("2020-06-15") & HatchDate <= as.Date("2020-06-28") ~ "Early", HatchDate >= as.Date("2020-06-29") & HatchDate <= as.Date("2020-07-12") ~ "Middle", HatchDate >= as.Date("2020-07-13") & HatchDate <= as.Date("2020-07-26") ~ "Late", TRUE ~ "Other" # 处理不在这三个区间的日期 ))
方式二:基础R的ifelse嵌套
AllData$HatchingPeriod <- with(AllData, ifelse(HatchDate >= as.Date("2020-06-15") & HatchDate <= as.Date("2020-06-28"), "Early", ifelse(HatchDate >= as.Date("2020-06-29") & HatchDate <= as.Date("2020-07-12"), "Middle", ifelse(HatchDate >= as.Date("2020-07-13") & HatchDate <= as.Date("2020-07-26"), "Late", "Other") ) ) )
3. 可选:删除临时的HatchDate列
如果不需要保留转换后的日期列,可以删掉:
AllData$HatchDate <- NULL
注意事项
- 请根据你的实际需求调整区间的起始和结束日期,确保逻辑是
>= 起始日且<= 结束日。 - 如果你的数据集里有2月29日的日期,用2020年这种闰年转换不会出错;如果没有,用普通年份(比如2021)也可以。
内容的提问来源于stack exchange,提问作者Vilde Jonasson Oddvik
相关产品推荐
相关产品推荐

