R:如何计算变量的每10行的平均值

时间:2014-12-02 02:53:34

标签: r

我有一些每1分钟收集一次的数据集,但我必须用10分钟的数据替换数据。所以我有这个R代码。

for(k in 1:(length(temp[,1])/10)){
  temp2[k,1]<-temp[1,1]
  temp2[k,2]<-temp[k*10,2]
  temp2[k,3]<-mean(na.omit(as.numeric(temp[((k-1)*10+1):k*10,3])))
}

但是,此代码的效率太低。 还有一个问题。由于某些数据丢失,时间变量并不总是连续的。我必须计算每10分钟的数据(例如2014-01-01 00:00到2014-01-01 00:10),无论这10分钟内有多少障碍物。所以循环进入

  tmp<-na.omit(temp[temp[,2]>(st+600*(k-1)) & temp[,2]<=(st+600*k),])
  temp2[k,1]<-tmp[1,1]
  temp2[k,2]<-st+600*k
  temp2[k,3]<-mean(na.omit(as.numeric(tmp[,3])))

这是不可忍受的。并且它无法有效处理像#34;有些月份缺失的情况&#34;。 那么,我怎样才能在R中解决这个问题,而效率并不低。

原始数据:

Time  Var1
2014-01-01 00:01  10
2014-01-01 00:02  12
2014-01-01 00:03  43

...
2014-01-01 00:10  52

期望的输出:

Time  Var1
2014-01-01 00:10  (mean of every 10 mins)
2014-01-01 00:20  (mean of every 10 mins)
...

3 个答案:

答案 0 :(得分:4)

查看xts包,特别是period.apply函数endpoints

假设您可以将数据作为xts对象(在本例中称为xt.data),那么以下内容将起作用。

# example data
times <- seq(Sys.time()-50000,Sys.time(),by=60)
mydt <- data.frame(time = times[sample(seq_along(times),size=300)], test = runif(300)) 
xt.data <- as.xts(mydt[,2], order.by= mydt[['time']])

period.apply(xt.data, endpoints(xt.data,'minutes',10),mean)

答案 1 :(得分:2)

查看?cut.POSIXt?seq.POSIXtround.POSIXtcutseq函数允许以"10 min"间隔设置中断,但遗憾的是圆函数似乎没有那么好的功能。您可以乘以10,舍入到最接近的“min”并除以10,但我还没有尝试过这一切。

答案 2 :(得分:1)

如果你记住,POSIXlt格式的时间使操作每个组件变得微不足道,那么它相对容易。我在这里做的是使用POSIXct格式读取数据(因为你无法用POSIXlt读入),转换为POSIXlt,然后只需10分钟的分组,转换回来,然后进行聚合。这应该运行得非常快。

dat <- read.table(text = 'time, y
                          2014-01-01 00:01, 10
                          2014-01-01 00:02, 12
                          2014-01-01 00:22, 43', 
                          header = TRUE, sep = ',', colClasses = c('POSIXct', 'numeric'))
dat$time <- as.POSIXlt(dat$time)
dat$time[[2]] <- floor(dat$time[[2]] / 10) * 10
dat$time <- as.POSIXct(dat$time)
aggregate(y ~ time, data = dat, mean)

顺便说一句,你说每10分钟替换一次,而不是聚合。在这种情况下,聚合线将变为:

y$time <- ave(y, time)

而且,如果您想保持原始时间和所有其他数据完好无损,但只需通过10分钟替换,您可以在read.table之后替换所有内容:

dat$time <- as.POSIXlt(dat$time)
g <- floor(dat$time[[2]] / 10) * 10
dat$y <- ave(y, g)