2014-02-13 36 views
1

對於R我很新,我試圖找到一種將連續數據平均到特定時間段的方法。對R上的氣象參數進行連續測量的平均值

我的數據是幾個參數的月份記錄,具有1秒的時間步長 通過read.csv的表在一列中有一個日期和時間,其他幾列中有值。

TimeStamp UTC Pitch Roll Heave(m) 
05-02-13 6:45 0 0 0 
05-02-13 6:46 0.75 -0.34 0.01 
05-02-13 6:47 0.81 -0.32 0 
05-02-13 6:48 0.79 -0.37 0 
05-02-13 6:49 0.73 -0.08 -0.02 

所以我想在平均特定間隔的數據:20分鐘比如在某種程度上的平均小時7:00,需要從時間6:41所有的點到7:00,並返回在此間隔內的平均值等等,對於整個數據集。 的時間間隔將是這樣的:

TimeStamp 
05-02-13 19:00 462 
05-02-13 19:20 332 
05-02-13 19:40 15 
05-02-13 20:00 10 
05-02-13 20:20 42 
+0

您是否試過'?cut.POSIXt' –

+1

@OlegS。停止拖動。這是一個非常直接的聚合問題,R非常適合這類事情。 –

回答

1

這類似於你自己的可重複的數據集。

meteorological <- data.frame(
    TimeStamp = rep.int("05-02-13", 1440), 
    UTC  = paste(
    rep(formatC(0:23, width = 2, flag = "0"), each = 60), 
    rep(formatC(0:59, width = 2, flag = "0"), times = 24), 
    sep = ":" 
), 
    Pitch  = runif(1440), 
    Roll  = rnorm(1440), 
    Heave  = rnorm(1440) 
) 

,你需要做的第一件事就是前兩列相結合,創造一個單一的(POSIXct)日期時間列。

library(lubridate) 
meteorological$DateTime <- with(
    meteorological, 
    dmy_hm(paste(TimeStamp, UTC)) 
) 

然後爲您的不同時間分組設置一系列斷點。

breaks <- seq(ymd("2013-02-05"), ymd("2013-02-06"), "20 mins") 

最後,您可以計算每個組的摘要統計信息。有很多方法可以做到這一點。 ddply來自plyr包是個不錯的選擇。

library(plyr) 
ddply(
    meteorological, 
    .(cut(DateTime, breaks)), 
    summarise, 
    MeanPitch = mean(Pitch), 
    MeanRoll = mean(Roll), 
    MeanHeave = mean(Heave) 
) 
+0

謝謝里奇棉花,它工作完美 – Elissar

+0

@Elissar很高興能爲您提供服務,點擊勾上的向上箭頭即可解答問題。 –

0

請看看一些簡單的像這樣對你的作品:

myseq <- data.frame(time=seq(ISOdate(2014,1,1,12,0,0), ISOdate(2014,1,1,13,0,0), "5 min")) 
myseq$cltime <- cut(myseq$time, "20 min", labels = F) 

> myseq 
        time cltime 
1 2014-01-01 12:00:00  1 
2 2014-01-01 12:05:00  1 
3 2014-01-01 12:10:00  1 
4 2014-01-01 12:15:00  1 
5 2014-01-01 12:20:00  2 
6 2014-01-01 12:25:00  2 
7 2014-01-01 12:30:00  2 
8 2014-01-01 12:35:00  2 
9 2014-01-01 12:40:00  3 
10 2014-01-01 12:45:00  3 
11 2014-01-01 12:50:00  3 
12 2014-01-01 12:55:00  3 
13 2014-01-01 13:00:00  4 
+0

seq.POSIXt中的錯誤(ISOdate(2014,1,1,12,0,0),ISOdate(2014,1,1,: invalid'by'字符串 – Elissar

+0

對不起,這是'by = 5分鐘''(而不是「5分鐘」) –