我有一些来自传感器的采样数据,样本之间没有特定的时间差异,如下所示:
> 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
格式。任何帮助将不胜感激。
答案 0 :(得分:0)
以下是使用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
汇总每个季度的数据(Glucose
,day
和hour
的每个组合的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
中。