是否存在支持向量运算且可指定单位的difftime()替代函数?
解决datetime向量自定义单位计算时间差的优雅方法
我有两个时间间隔差异很大的datetime向量,一个是秒级间隔,一个是天级间隔,示例代码如下:
# 按秒递增的向量 time1 <- ymd_hms(c("2023-05-02 14:15:00", "2023-05-02 14:15:01", "2023-05-02 14:15:02")) # 按天递增的向量 time2 <- ymd_hms(c("2023-05-02 14:15:00", "2023-05-03 14:15:00", "2023-05-04 14:15:00"))
使用diff()函数计算时间差时,它会自动选择时间单位,无法自定义,导致出现diff(time1) == diff(time2)返回TRUE的情况,这显然不符合需求。
而difftime()虽然支持指定units参数,但不能直接传入单个向量调用,会报错:
difftime(time1) # Error in difftime(time1) : argument "time2" is missing, with no default
有没有能对整个向量计算时间差且支持指定单位的函数?或者比下面这种写法更优雅的实现方式?
sapply(seq(1, length(time1)-1, 1), function(i){difftime(time1[i+1], time1[i], units= "sec")})
优雅实现方式
不需要用sapply循环,直接利用向量索引操作就能让difftime处理整个向量的相邻元素时间差:
# 对time1计算秒级时间差 difftime(time1[-1], time1[-length(time1)], units = "sec") # 结果:Time differences in secs # [1] 1 1 # 对time2计算天级时间差 difftime(time2[-1], time2[-length(time2)], units = "days") # 结果:Time differences in days # [1] 1 1
这里time1[-1]取向量除第一个元素外的所有元素,time1[-length(time1)]取向量除最后一个元素外的所有元素,两者做差刚好对应相邻元素的时间差,代码简洁高效。
如果使用dplyr包,还可以用lag()函数实现,可读性更强:
library(dplyr) # 计算time1的秒级时间差 difftime(time1, lag(time1), units = "sec")[-1] # 结果:Time differences in secs # [1] 1 1 # 计算time2的天级时间差 difftime(time2, lag(time2), units = "days")[-1] # 结果:Time differences in days # [1] 1 1
lag(time1)会生成一个比原向量滞后一位的向量,和原向量做差后去掉第一个NA值即可。
内容的提问来源于stack exchange,提问作者LulY
相关产品推荐
相关产品推荐

