在R中每隔15分钟创建一个循环来计算每个因子变量的平均值

时间:2016-06-12 20:35:14

标签: r loops date

我的数据有以下形式:

data

我想创建一个循环,每次都会从开始到接下来的15分钟进行观察,然后在前15分钟后再进行15分钟等,并计算每个传感器的平均值。我想找出每个传感器每15分钟平均值变化的差异。 我已将日期设为

 dtm <- strptime("21/09/2015 10:41:00", format = "%d/%m/%Y %H:%M:%S",
                 tz = "CET")     

和分钟的功能。

mns <- function(m) {x <- m * 60 return(x)}    

quart=rep(NA,nrow(data))
mean.min=rep(NA,nrow(data))
diff.min=rep(NA,nrow(data))
for (i in 0:4){
quart[i] <- data[data$Date >= dtm+mns(15)*i & data$Date <= dtm+mns(15)*(i+1),]
data$mean.min[i]<-aggregate(quart[i]$Value~quart[i]$SensorId, FUN=mean)
data$diff.min[i+1]<-rowMeans(abs(data$mean.min[i+1]-data$mean.min[i]),na.rm=T)}

2 个答案:

答案 0 :(得分:1)

考虑使用sapply()这个冗长的基础解决方案,该解决方案结合了运行SensorId组计数和运行15分钟计数。由于其性质,平均值计算为总和/计数。

data$run15minavg <- sapply(1:nrow(data), function(i) {
                sum(((data[1:i, c("Date")] >= (data$Date[i] - as.difftime(15, units="mins")))
                      & (data[1:i, c("Date")] <= (data$Date[i]))
                      & (data[1:i, c("SensorId")] == data$SensorId[i]))
                   *  data[1:i,]$Value) /
                sum((data[1:i, c("Date")] >= (data$Date[i] - as.difftime(15, units="mins")))
                      & (data[1:i, c("Date")] <= (data$Date[i]))
                      & (data[1:i, c("SensorId")] == data$SensorId[i]))
                }    
             )

答案 1 :(得分:0)

cut命令和dplyr包使这个操作变得简单:

#generate sample data
date<-seq(from= as.POSIXct("2016-06-01"), by="1 sec", length.out = 1000)
sensorid<-sample(c("A sensor", "B sensor", "C sensor"), 1000, replace = TRUE )
value<-rnorm(1000, 50)
df<-data.frame(date, sensorid, value)


#group the results by sensor and 15 minute intervals
library(dplyr)
summarize(group_by(df, cut(df$date, breaks="15 min"), sensorid), mean(value))