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

Posted

技术标签:

【中文标题】根据时间频率将特定函数应用于数据帧的某个子集【英文标题】:Apply a specific function to a certain subset of a dataframe based on time frequency 【发布时间】:2016-11-08 09:39:14 【问题描述】:

我很难弄清楚如何根据时间频率将平均函数应用于我的数据帧的子集。

我准确地解释了我的具体情况:我有一个数据框报告关于在特定日期/时间测量的卡车(具有特定车牌号)的燃料消耗数据。 我想计算最大时间频率为 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 因此它是正确的日期/时间可能会对您有所帮助。

对我应该使用的功能有什么想法吗?我想也许可以使用函数聚合来做到这一点?但是如何指定时间频率呢?

感谢您的宝贵时间和帮助。

【问题讨论】:

请使用 dput(df) 共享您的数据(或部分数据),其中 df 是您的 data.frame。这样我们就可以处理一个例子。谢谢! 您好,我不能分享我的实际数据。我给了你一个我的数据框结构的例子。请问,可以用吗? df 好吧,你也可以转储你的假数据,这样我们就可以立即在 R 中读取。下次记住。 非常感谢埃德温!我将立即尝试您的解决方案!看起来真的很巧妙! 上网查了一下,我发现了一种叫做“时间序列”的数据类型……也许它可以作为定义特定频率=5分钟的问题的另一种解决方案……不是吗?跨度> 【参考方案1】:

首先定义一个函数,计算自第一次观察以来的秒数。如果超过 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))

【讨论】:

以上是关于根据时间频率将特定函数应用于数据帧的某个子集的主要内容,如果未能解决你的问题,请参考以下文章

如何根据不同 R 生态系统中的另一个向量重写代码,将函数应用于行子集?

如何让df.loc只返回数据帧的特定单元格中的值(数字)?

如何有效地迭代 Pandas 数据帧的连续块

将函数应用于多索引多列数据帧的 Pythonic 方法是啥?

将数据帧返回函数应用于基础数据帧的每一行

如何将函数应用于增加数据框中的数据子集