如何从其他列补全缺失的lubridate类型下车时间?
解决方案
核心思路
按出租车分组,仅对有后续接客记录的缺失下车时间,用下一次接客时间减1秒补全;无后续接客的分组(如出租车2)因无数据支撑,缺失值保留NA。同时用lubridate处理时间运算,按需转换为指定格式。
完整代码
library(dplyr) library(lubridate) # 原始数据生成(保留你的复现代码) x <- seq(as.POSIXct('2020/01/01'), as.POSIXct('2030/01/01'), by = "10 mins") %>% head(20) %>% sort() taxi_nr <- c(1, 1, 1, 2, 2, 3, 3, 3, 3, 4) drop_of <- x[c(TRUE, FALSE)] pick_up <- x[c(FALSE, TRUE)] drop_of[2] <- NA drop_of[5] <- NA drop_of[7] <- NA df <- data.frame(taxi_nr,pick_up,drop_of) %>% arrange(pick_up) # 补全缺失值+格式转换 df_clean <- df %>% group_by(taxi_nr) %>% mutate( # 仅补全有后续接客记录的缺失下车时间 drop_of = case_when( is.na(drop_of) & !is.na(lead(pick_up)) ~ lead(pick_up) - seconds(1), TRUE ~ drop_of ), # 转换为d/m/y-h/m/s字符串格式(若需保留lubridate时间对象可删除此两行) pick_up = format(pick_up, "%d/%m/%Y-%H:%M:%S"), drop_of = ifelse(!is.na(drop_of), format(drop_of, "%d/%m/%Y-%H:%M:%S"), NA) ) %>% ungroup() # 查看结果 print(df_clean)
代码细节说明
group_by(taxi_nr):确保每辆出租车的时间逻辑独立,不会跨车取数lead(pick_up):获取当前分组内下一行的接客时间,无后续记录时返回NAcase_when():精准控制补全规则,避免无意义的补全- 若需保留
lubridate原生时间对象(而非字符串),删除format()相关代码即可,后续可随时按需转换格式
内容的提问来源于stack exchange,提问作者DeMelkbroer
相关产品推荐
相关产品推荐

