根据时间频率将特定函数应用于数据帧的某个子集
Apply a specific function to a certain subset of a dataframe based on time frequency
我无法弄清楚如何根据时间频率将均值函数应用于我的数据帧的子集。
我准确地解释了我的具体情况:我有一个数据框报告有关在特定 day/time 测量的卡车(具有特定车牌号)的油耗数据。
我想计算最大时间频率为 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 所以它是一个正确的 date/time.
可能对你有帮助
知道我应该使用的功能吗?我想也许可以使用聚合函数来做到这一点?但是如何指定时间频率呢?
感谢您的宝贵时间和帮助。
首先定义一个函数来计算自第一次观察以来的秒数。如果超过 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.number
和 group
组合的平均值。
df_group %>%
group_by(plate.number, group) %>%
summarise(mn = mean(fuel.consumption))
我无法弄清楚如何根据时间频率将均值函数应用于我的数据帧的子集。
我准确地解释了我的具体情况:我有一个数据框报告有关在特定 day/time 测量的卡车(具有特定车牌号)的油耗数据。 我想计算最大时间频率为 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 所以它是一个正确的 date/time.
可能对你有帮助知道我应该使用的功能吗?我想也许可以使用聚合函数来做到这一点?但是如何指定时间频率呢?
感谢您的宝贵时间和帮助。
首先定义一个函数来计算自第一次观察以来的秒数。如果超过 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.number
和 group
组合的平均值。
df_group %>%
group_by(plate.number, group) %>%
summarise(mn = mean(fuel.consumption))