获取数据框和分配中每四分之一小时的所有聚合值的平均值

时间:2017-11-19 17:37:15

标签: r time-series mean cut posixct

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

> 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

数据以存储在列表Y_cl,中的Dataframes格式保存,每个列表元素为一天。我试图在时钟的每四分之一小时之间选择所有样本并得到平均值,每天每小时得4分,数学定义(非代码)为:

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分钟差异的链接,而我需要根据每个小时的数据对每小时的数据进行分组。小时他们在,平均,并将结果分配到相应的季度。 Y_cl[[1]]['POS']采用标准POSIXct格式。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

以下是使用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

汇总每个季度的数据(Glucosedayhour的每个组合的quarter的平均值:

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

答案 1 :(得分:0)

我通过将每个时间戳记的分钟结果除以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中。