2015-02-23 92 views
0

我有一個數據幀,每小時觀測和模擬空氣質量數據。附加信息被測量站,國家,stationtype和型號:R:聚合與時間平均值

> head(PM10val) 
       date station type model country obs mod 
1 2009-01-01 00:00:00 BELAB01 sB chimere  BE 63 13.45 
2 2009-01-01 01:00:00 BELAB01 sB chimere  BE 50 18.71 
3 2009-01-01 02:00:00 BELAB01 sB chimere  BE 77 20.65 
4 2009-01-01 03:00:00 BELAB01 sB chimere  BE 68 21.42 
5 2009-01-01 04:00:00 BELAB01 sB chimere  BE 58 22.47 
6 2009-01-01 05:00:00 BELAB01 sB chimere  BE 62 24.02 

我想使用timeAverage函數(計算包含日期字段中數據幀的時間平均)的OpenAir包的每日計算或年度平均值,每站和每個模型。我想:

> anmean <- aggregate(PM10val, by=list(PM10val$station,PM10val$model), 
+   function (x) timeAverage(x,avg.time="year",data.thresh=75, statistic="mean")) 

這應該算年平均爲平均「OBS」和每個型號和臺「國防部」,有75%的數據捕獲閾值。 但它返回:

Error in `[.default`(mydata, , Names) : incorrect number of dimensions 
    11 NextMethod("[") 
10 `[.POSIXct`(mydata, , Names) 
9 mydata[, Names] 
8 checkPrep(mydata, vars, type = "default", remove.calm = FALSE, 
    strip.white = FALSE) 
7 timeAverage(x, avg.time = "year", data.thresh = 75, statistic = "mean") 
6 FUN(X[[1L]], ...) 
5 lapply(X = split(e, grp), FUN = FUN, ...) 
4 FUN(X[[1L]], ...) 
3 lapply(x, function(e) { 
    ans <- lapply(X = split(e, grp), FUN = FUN, ...) 
    if (simplify && length(len <- unique(sapply(ans, length))) == 
    1L) { ... 
2 aggregate.data.frame(PM10val, by = list(PM10val$station, PM10val$model), 
    function(x) timeAverage(x, avg.time = "year", data.thresh = 75, 
     statistic = "mean")) 
1 aggregate(PM10val, by = list(PM10val$station, PM10val$model), 
    function(x) timeAverage(x, avg.time = "year", data.thresh = 75, 
     statistic = "mean")) 

我在做什麼錯了?我總是可以使用一個循環,但我不認爲這是要走的路。 謝謝!

+0

究竟是什麼'timeAverage(PM10val,avg.time =「year」,data.thresh = 75,statistic =「mean」)'return?另外,出錯後請提供'traceback()'的結果。 – 2015-02-23 12:04:31

+1

我在上面的主要問題中添加了它。對不起,這是我第一次問一個問題! – 2015-02-23 15:13:49

回答

1

我會推薦使用ddply來代替。數據類型有POSIXctaggregate有一些問題。實際上你的功能見x作爲日期,而不是子數據幀。

以下代碼適用於比利時數據。 函數ddply也是一樣的,它按照您指定的級別進行分割,作爲第二個參數c("site", "country"),首先將按「站點」和「國家/地區」分割,然後爲每個分割應用函數。爲了縮短代碼,我已將函數包裝到Funfun。另外技術性是bind_rows = rbind.fill只是爲importAirbase函數中的綁定數據設置的。您可以用您的數據替換data2,它應該可以工作。

library(plyr) 
Funfun = function (x) timeAverage(x, avg.time="year", data.thresh=75, statistic="mean") 
bind_rows = rbind.fill 
data2 = importAirbase(site = c("BELAB01","BELAB02") , year = 2011:2012, pollutant = NA, 
    add = c("country", "site.type"), splice = FALSE, local = NA) 
ddply(data2, c("site", "country"), Funfun) 
+0

我剛剛做到了。然而,小小的評論:選項「data.tresh = 75」似乎不起作用。有小於每小時6750個有效小時數據的臺站,並且仍然計算年平均值。奇怪 – 2015-02-25 14:55:09

+0

@SandyAdriaenssens,它沒有'ddply'嗎? 'timeAverage(data2,avg.time =「year」,data.thresh = 75,statistic =「mean」)'。有一個出路,你可以在你用ddply申請的函數中進行過濾。在行'timeAverage'之前加上'x < - subset(x,mod <75)'行。 – 2015-02-25 18:55:42

+0

問題解決:應該是「data.thresh」而不是「data.tresh」。只是忘了字母「h」。顯然這沒有錯誤,但是被忽略了! – 2015-02-26 09:13:25