使用dplyr按时间生成时段列失效,求可行解决方法
问题解决:新增时段TOD列异常的修复
核心原因
你的time字段类型与hms()生成的时间对象不兼容,导致比较逻辑失效,出现全NA或全"night"的结果。常见情况是time为字符型而非hms/Period类型,或是用了不支持秒数的hm()进行转换。
解决方案1:确保time为hms格式后判断
先把字符型的time转换成支持时分秒的hms格式,再执行时段判断:
library(dplyr) library(hms) mobile2022 <- mobile2022 %>% # 转换时间格式,as_hms支持含秒数的字符型时间 mutate(time = as_hms(time)) %>% mutate(TOD = case_when( time >= as_hms("00:00:00") & time <= as_hms("04:59:59") ~ "early morning", time >= as_hms("05:00:00") & time <= as_hms("09:59:59") ~ "morning", time >= as_hms("10:00:00") & time <= as_hms("14:59:59") ~ "afternoon", time >= as_hms("15:00:00") & time <= as_hms("18:59:59") ~ "evening", TRUE ~ "night" ))
解决方案2:提取小时数判断(更稳妥)
如果你的time是带日期的POSIXct类型,或不想纠结时间格式,直接提取小时数来划分时段:
library(dplyr) library(lubridate) mobile2022 <- mobile2022 %>% mutate( # 提取时间的小时部分 hour_val = hour(time), TOD = case_when( hour_val %in% 0:4 ~ "early morning", hour_val %in% 5:9 ~ "morning", hour_val %in% 10:14 ~ "afternoon", hour_val %in% 15:18 ~ "evening", TRUE ~ "night" ) )
验证步骤
- 用
class(mobile2022$time)查看原字段类型,确认转换方向。 - 转换后用
head(mobile2022$time)检查时间格式是否正确,确保无NA值。
内容的提问来源于stack exchange,提问作者bre123
相关产品推荐
相关产品推荐

