我有一个如下的数据框
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
。在上面的示例中,应该将行
1
,2
和3
组合在一起,而应将行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/