我的数据有以下形式:
我想创建一个循环,每次都会从开始到接下来的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)}
答案 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))