获取数据框中每刻钟的所有聚合值的平均值并分配

Getting Mean of all aggregated values for every quarter hour in dataframe and assigning

我有一些来自传感器的采样数据,样本之间没有特定的时间差异,如下所示:

> Y_cl[[1]]
     index       Date     time Glucose                 POS
10      11 2017-06-10 03:01:00     136 2017-06-10 00:01:00
14      15 2017-06-10 03:06:00     132 2017-06-10 00:06:00
18      19 2017-06-10 03:11:00     133 2017-06-10 00:11:00
22      23 2017-06-10 03:16:00     130 2017-06-10 00:16:00
26      27 2017-06-10 03:20:59     119 2017-06-10 00:20:59
30      31 2017-06-10 03:26:00     115 2017-06-10 00:26:00
34      35 2017-06-10 03:30:59     117 2017-06-10 00:30:59
38      39 2017-06-10 03:36:00     114 2017-06-10 00:36:00
42      43 2017-06-10 03:40:59     113 2017-06-10 00:40:59

数据以Dataframes格式保存在列表中Y_cl,每个列表元素为一天。我正在尝试 select 时钟每刻钟之间的所有样本并获得平均值,从而导致每天每小时的 4 点,数学定义(NOT CODE)为:

mean(Glucose(H:00 <Y_cl[[1]]$time< H:15))==> Glucose_av(H:00), 
mean(Glucose(H:15 <Y_cl[[1]]$time< H:30))==> Glucose_av(H:15), 
mean(Glucose(H:30 <Y_cl[[1]]$time< H:45))==> Glucose_av(H:30), 
mean(Glucose(H:45 <Y_cl[[1]]$time< (H+1):00))==>Glucose_av(H:45)

我曾尝试搜索,但找到了有关如何每 15 分钟 select 或 削减 的链接 差异,而我需要根据他们在小时的哪个季度对每个小时的数据进行分组,取平均值,并将结果分配给相应的季度。 Y_cl[[1]]['POS'] 是标准的 POSIXct 格式。任何帮助将不胜感激。

这是一个使用 lubridateplyr 包的解决方案:

data$POS <- NULL
data$POS = as.POSIXct(paste(data$Date, data$time)) # POS correction
library(lubridate)
library(plyr)

data$day <- day(data$POS) # extract day
data$hour <- hour(data$POS) # extract hour
data$minute <- minute(data$POS) # extract minute

根据季度创建一个新因素:

data$quarter <- NA
data$quarter[data$minute >= 0 &  data$minute < 15] <- "q1" # 1st quarter
data$quarter[data$minute >= 15 &  data$minute < 30] <- "q2" # 2ndquarter
data$quarter[data$minute >= 30 &  data$minute < 45] <- "q3" # 3rd quarter
data$quarter[data$minute >= 45 &  data$minute < 60] <- "q4" # 4th quarter

汇总每个季度的数据(计算 dayhourquarter 的每个组合的 Glucose 的平均值):

output <- ddply(data, c("day", "hour", "quarter"), summarise, result = mean(Glucose)) 

结果:

> output
  day hour quarter   result
1  10    3      q1 133.6667
2  10    3      q2 121.3333
3  10    3      q3 114.6667

我通过将每个时间戳的分钟数除以 15 的结果取整,其中 YPOS 是每天 i 的时间戳中的列表和列表 Y_cl存在:

SeI<- function(i){

*###seperate the hours from the minutes for use later and store in K1*
strftime(YPOS[[i]], format="%H")

K1<- (floor((as.numeric(strftime(YPOS[[i]], format="%M")))/15))*15

*###get the minutes and divide by 15, keeping the floor,multiplying by 15,store in K2*
K2<- strftime(YPOS[[i]], format="%Y-%m-%d %H", tz="GMT")

*###paste K1 and K2 together an save in POSTIXCT format as T_av*
TT<- paste0(K2, ':', K1)
T_av<- as.POSIXct(TT,format="%Y-%m-%d %H:%M", tz="GMT" )}

然后在列表中的所有日子应用它:

lapply(1:length(Y_cl), function(i) SeI(i) )

我的解决方案包括从列表 Y_cl 中取出时间戳并将其保存在 YPOS 中。