我有一个如下的数据框

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 毫秒重新采样此数据帧。

也就是说,每200毫秒取一次value的平均值。

我知道可以使用lubridate::floor_date(time, '1 second')达到second的精度,但不能使用milliseconds

在上面的示例中,应该将行123组合在一起,而应将行4单独放置(请注意,彼此之间的间隔为2秒)。

有任何想法吗?
谢谢!

最佳答案

您对xts解决方案的评论要求将其“重新插入”数据框,这一事实使我认为您需要合并结果或按时间分组的列。这就是baset R中ave函数的功能。可能有一个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 -value是因为seq函数可以使用(由于我不明白的原因)无法使用原始的“datetime”变量。

关于r - R:如何在毫秒级别重新采样日期时间变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41402202/

10-12 17:46
查看更多