根据时间频率将特定函数应用于数据帧的某个子集

时间:2016-07-06 10:52:51

标签: r time-series aggregate xts

我有一个问题是弄清楚如何根据时间频率将平均函数应用于我的数据帧子集。

我完全解释了我的具体情况:我有一个数据框报告有关特定日期/时间测量的卡车燃油消耗量(具有特定车牌号)的数据。 我想计算时间序列的燃料消耗平均值,最大时间频率为5分钟(如果连续事件发生5分钟,则计算平均值)。

这是初始数据帧的示例,以及我想要获取的数据子集:

data.frame:

列名分别为plate.number,date.time和fuel.consumption

     AB              2016-07-03 09:21:10                 23.45
     AB              2016-07-03 09:22:33                 33.65
     BC              2016-07-03 09:23:28                 56.22
     AB              2016-07-03 09:24:13                 21.33
     BC              2016-07-03 10:32:45                 33.42
     ZF              2016-07-03 10:32:45                 28.45
     ZF              2016-07-03 10:34:12                 29.55
     AB              2016-07-03 11:26:54                 28.73
     AB              2016-07-03 11:27:33                 27.98
     BC              2016-07-03 11:28:45                 42.45
     AB              2016-07-04 10:32:45                 34.72
     AB              2016-07-04 10:33:33                 30.51
     AB              2016-07-04 14:54:28                 28.66

在这种情况下是时间序列:

     AB              2016-07-03 09:21:10                 23.45
     AB              2016-07-03 09:22:33                 33.65
     AB              2016-07-03 09:24:13                 21.33

或者:

     AB              2016-07-03 11:26:54                 28.73
     AB              2016-07-03 11:27:33                 27.98

正如您所看到的,一个事件与下一个事件之间的时间少于5分钟。一旦我拥有这些组,就很容易计算每组的燃料消耗平均值。

啊,你知道“date.time”格式是POSIXct可能会有所帮助,所以它是一个合适的日期/时间。

关于我应该使用的功能的任何想法?我想也许有可能使用函数聚合来做到这一点?但是如何指定时间频率?

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:0)

首先定义一个计算自第一次观察以来秒数的函数。如果超过300,请启动新组并重置开始时间。函数假定观察结果是及时排序的。

group_on_seconds <- function(df_part, 
                             nr_of_secs = 300) {
  group_start   <- df_part$date.time[1]
  group_ind     <- df_part$group   <- 1

  for(i in 2:nrow(df_part)) {
        if( (as.numeric(df_part$date.time[i]) - 
             as.numeric(group_start)) > nr_of_secs) {
       group_start <- df_part$date.time[i]
       group_ind   <- group_ind + 1 
    }
    df_part$group[i] <- group_ind
  }
  df_part
}

按时订购df,将其拆分为铭牌号并应用该功能。将结果重新绑定在一起。

library(dplyr)
df_group <- df[order(df$date.time), ] %>% 
  split(df$plate.number) %>%
  lapply(group_on_seconds) %>%
  do.call('rbind', .)

计算plate.numbergroup组合的平均值。

df_group %>%  
  group_by(plate.number, group) %>%
  summarise(mn = mean(fuel.consumption))