2014-12-02 239 views
3

我有一些数据集是每1分钟收集一次,但我必须用10分钟的数据平均数来替换数据。所以我有这个R代码。R:如何计算变量的每10行的平均值

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分钟有多少obs。所以循环去

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]))) 

这是不能忍受的。它不能有效地处理像“有几个月不见了”的情况。 那么,如何在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) 
... 
+0

你能提供一些数据和所需的输出吗? – DatamineR 2014-12-02 03:07:04

+0

您需要使用dput()将我们的数据的编辑子集转储给我们。看看'zoo :: rollmean()'fn和'tseries'包。 – smci 2014-12-02 03:09:26

回答

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) 
2

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

1

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

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)