如何在R中正确使用data.table的fifelse函数实现时间列条件更新
问题根因
difftime参数顺序颠倒:difftime(time1, time2)返回time1 - time2的差值,你计算时传入的是difftime(start_date, x),其中start_date为2011-01-01,x即RequestTime除第一条外均晚于start_date,因此计算结果全部为负数,天然满足< 86400的条件,导致fifelse所有分支都走了保留原值的逻辑,最终无任何修改。- 类型不统一的隐形风险:
start_date是Date类型,和POSIXct类型的RequestTime做运算时,会默认取start_date的零点作为计算基准,若业务逻辑中起始时间不是零点,会出现计算偏差。
修复代码
直接调换difftime的参数顺序即可,同时建议统一日期类型避免隐形转换:
library(data.table) x <- dt$RequestTime y <- dt$ExportTime # 统一转为POSIXct类型,可按需指定时区 start_date <- as.POSIXct("2011-01-01") dt$ExportTime <- fifelse( difftime(x, start_date, units = "secs") < 86400, y, y - difftime(x, start_date, units = "secs") )
运行后只有第一条RequestTime在start_date后24小时内的记录保留原ExportTime,其余4条均按规则完成修改。
内容的提问来源于stack exchange,提问作者Sanam
相关产品推荐
相关产品推荐

