我有一个如下的数据框
library(dplyr)
library(lubridate)
time = c('2013-01-03 22:04:21.549', '2013-01-03 22:04:21.549', '2013-01-03 22:04:21.559', '2013-01-03 22:04:23.559' )
value = c(1,2,3,4)
data <- data_frame(time, value)
data <-data %>% mutate(time = ymd_hms(time))
# A tibble: 4 × 2
time value
<dttm> <dbl>
1 2013-01-03 22:04:21.549 1
2 2013-01-03 22:04:21.549 2
3 2013-01-03 22:04:21.559 3
4 2013-01-03 22:04:23.559 4
我想每200毫秒对该数据帧重新采样一次。
也就是说,平均value
每200毫秒一次。
我知道可以lubridate::floor_date(time, '1 second')
用尽second
精度,但是不能用milliseconds
。
在上面的示例中,row 1
,2
和3
应该分组在一起,而row4
应该单独存在(请注意,彼此2
之间相差几秒钟)。
有任何想法吗?谢谢!
您对xts解决方案的评论要求将其“重新插入”数据框,这一事实使我认为您需要合并结果或按时间分组的列。那就是ave
函数在base R中的功能。可能有一个dplyr
等效项,但是我更像是base-R-guy:编辑:
data$ms200mn <- ave(data$value,
cut( arg <- as.numeric(data$time) ,
breaks=seq( floor(arg[1]), ceil(arg[4]), by=0.2) ),
FUN=mean)
> data
# A tibble: 4 × 3
time value ms200mn
<dttm> <dbl> <dbl>
1 2013-01-03 22:04:21 1 2
2 2013-01-03 22:04:21 2 2
3 2013-01-03 22:04:21 3 2
4 2013-01-03 22:04:23 4 4
这实际上并没有适当地称为“采样”(或重采样),而是聚合。seq.POSIXt
-function没有“ msec”选项(因此需要转换为数字秒),并且不允许小数秒。
解释:
cut(arg <- as.numeric(data$time), breaks=seq( floor(arg[1]), ceil(arg[4]), by=0.2) )
它是按一系列中断定义的组中的项目“分类”或“分类”,这些中断序列从第一个项目的下方开始,到最后一个项目的上方结束。将arg
要创建的需要-值,因为(原因我不明白),不能使用原始“日期时间”变量可以由所使用的seq
功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句