【问题标题】:Can I aggregate time series data between an on and off date using a data table join or the aggregate function?我可以使用数据表连接或聚合函数来聚合开启日期和关闭日期之间的时间序列数据吗?
【发布时间】:2019-12-21 14:30:53
【问题描述】:

我想有效地总结收集离散样本期间的连续气象数据。

我目前使用一个耗时的循环来执行此操作,但我想存在更好的解决方案。我是 data.table 语法的新手,但似乎应该有一个加入的解决方案。

continuous <- data.frame(Time = seq(as.POSIXct("2019-01-01 0:00:00"),
                                    as.POSIXct("2019-01-01 9:00:00"),"hour"),
                         CO2  = sample(400:450,10), 
                         Temp = sample(10:30,10))

> continuous
                  Time CO2 Temp
1  2019-01-01 00:00:00 430   11
2  2019-01-01 01:00:00 412   26
3  2019-01-01 02:00:00 427   17
4  2019-01-01 03:00:00 435   29
5  2019-01-01 04:00:00 447   23
6  2019-01-01 05:00:00 417   19
7  2019-01-01 06:00:00 408   12
8  2019-01-01 07:00:00 449   28
9  2019-01-01 08:00:00 445   20
10 2019-01-01 09:00:00 420   27

discrete <- data.frame(on = c(as.POSIXct("2019-01-01 0:00:00"),
                              as.POSIXct("2019-01-01 3:00:00")),
                      off = c(as.POSIXct("2019-01-01 3:00:00"),
                              as.POSIXct("2019-01-01 8:00:00")))

> discrete
                   on                 off
1 2019-01-01 00:00:00 2019-01-01 03:00:00
2 2019-01-01 03:00:00 2019-01-01 08:00:00

discrete[, c("CO2.mean","Temp.mean")] <- 
    lapply(seq(length(c("CO2","Temp"))), function(k) 
        unlist(lapply(seq(length(discrete[, 1])), function(i) 
            mean(continuous[
                which.closest(continuous$Time,discrete$on[i]):
                which.closest(continuous$Time, discrete$off[i]), 
                    c("CO2","Temp")[k]]))))

> discrete
                   on                 off CO2.mean Temp.mean
1 2019-01-01 00:00:00 2019-01-01 03:00:00    426.0  20.75000
2 2019-01-01 03:00:00 2019-01-01 08:00:00    433.5  21.83333

这是可行的,但是当将数十个连续变量聚合成数百个采样周期时,需要很长时间才能运行。感谢您的帮助!

【问题讨论】:

  • 请注意,如果没有 set.seed,当您使用 sample 创建输入时,将无法重现预期的输出

标签: r data.table time-series aggregate


【解决方案1】:

一个选项是data.table中的非等连接

library(data.table)
setDT(continuous)[discrete, .(CO2mean = mean(CO2), 
    Tempmean = mean(Temp)),on = .(Time >= on, Time <= off), by = .EACHI]

或使用滚动连接

setDT(continuous)[discrete, .(CO2mean = mean(CO2), 
   Tempmean = mean(Temp)),on = .(Time = on, Time = off),
        by = .EACHI, roll = 'nearest']

【讨论】:

  • 理想情况下,我可以从连续数据集中提供一个列名的向量(或列表?),但这很好用,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 2014-12-18
  • 2018-01-14
  • 2016-02-01
  • 1970-01-01
相关资源
最近更新 更多