2014-12-02 122 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)