2015-02-23 1 views
0

У меня есть dataframe с почасовыми наблюдаемыми и смоделированными данными о качестве воздуха. Дополнительная информация измерение станции, страны, stationtype и модель:R: агрегат в сочетании с timeAverage

> 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 (рассчитать временные средние в dataframe, содержащем поле даты) пакет OpenAir для расчета ежедневно или среднегодовых значений , для каждой станции и для каждой модели. Я пробовал:

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

Это следует рассчитать среднегодовые средние значения для «набл» и «мода» на модель и станции, с порогом захвата данных на 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()'. –

+1

Я добавил его в свой основной вопрос выше. Извините за путаницу, это первый раз, когда я задаю вопрос! –

ответ

1

Вместо этого я рекомендую использовать ddply. Существуют некоторые проблемы с типом данных POSIXct и aggregate. Фактически, ваша функция видит x как дату, а не sub data.frame.

Следующий код работает с данными Бельгии. Функция 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 действительными почасовыми данными, и годовая средняя по-прежнему рассчитывается. Strange –

+0

@SandyAdriaenssens, работает ли это без 'ddply'? с 'timeAverage (data2, avg.time =" year ", data.thresh = 75, statistic =" mean ")'. Существует выход, вы можете фильтровать в рамках функции, которую вы применяете с ddply. Просто добавьте строку с 'x <- subset (x, mod <75)' перед строкой с 'timeAverage' –

+0

Задача решена: она должна быть« data.thresh »вместо« data.tresh ». Просто забыли письмо «h». По-видимому, это не дает никаких ошибок, но просто игнорируется! –