获取数据框中每刻钟的所有聚合值的平均值并分配
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
格式。任何帮助将不胜感激。
这是一个使用 lubridate
和 plyr
包的解决方案:
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
汇总每个季度的数据(计算 day
、hour
和 quarter
的每个组合的 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
中。
我有一些来自传感器的采样数据,样本之间没有特定的时间差异,如下所示:
> 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
格式。任何帮助将不胜感激。
这是一个使用 lubridate
和 plyr
包的解决方案:
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
汇总每个季度的数据(计算 day
、hour
和 quarter
的每个组合的 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
中。