我有一个POSIXct数据的向量,想要计算连续元素之间的差异,就像diff
e.g:
burst <- as.POSIXct(c("2016-11-07 17:20:52","2016-11-07 16:21:52", "2016-11-07 15:21:52", "2016-11-02 17:20:52","2016-11-02 16:21:52", "2016-11-02 15:21:52"))
conti <- as.POSIXct(c("2016-11-07 17:20:52","2016-11-06 17:20:52", "2016-11-05 17:20:52", "2016-11-04 17:20:52","2016-11-03 17:20:52", "2016-11-02 17:20:52"))
diff(burst)
diff(conti)
我的问题是,单位不相等。我记得函数difftime
有一个名为unit
的参数,但是我无法构造一个apply
- 函数来获得类似于diff
的模拟行为。
答案 0 :(得分:0)
我不确定是否可以使用diff
为POSIXt对象强制执行特定单位。如果没有,您可以直接使用数值,然后设置类和单位属性,这样您仍然会有一个带有单位属性的difftime
对象。
例如,要在几分钟内获得差异:
burst.diff = diff(as.numeric(burst))/60
burst.diff = as.difftime(burst.diff, units="mins")
burst.diff
Time differences in mins [1] -59 -60 -7141 -59 -60
如果您不关心维护对象类或单位,那么您可以这样做:
burst.diff = diff(as.numeric(burst))/60
您可以将其打包为一个功能。我不确定这是不是&#34;对&#34;关于我如何处理类和属性的方式,我有兴趣知道是否有更好的方法来做到这一点:
my_difftime = function(x, units="mins") {
div = c("secs"=1, "mins"=60, "hours"=3600)
if(is.na(match(units, names(div)))) {
stop('Please specify either units as either "secs", "mins", or "hours"')
} else {
x = diff(as.numeric(x))/div[match(units, names(div))]
as.difftime(x, units=units)
}
}
lapply(list(burst=burst, conti=conti), my_difftime, units="hours")
$burst Time differences in hours [1] -0.9833333 -1.0000000 -119.0166667 -0.9833333 -1.0000000 $conti Time differences in hours [1] -24 -25 -24 -24 -24