【问题标题】:R: aggregate combined with timeAverageR:聚合与 timeAverage 结合
【发布时间】:2015-02-23 11:54:51
【问题描述】:

我有一个数据框,其中包含每小时观察和建模的空气质量数据。附加信息是测量站、国家、站类型和型号:

> 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

我想使用 openair 包的 timeAverage 函数(计算包含日期字段的数据帧的时间平均值)来计算每个站点和每个模型的每日或每年平均值。我试过了:

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

这应该计算每个模型和站点的“obs”和“mod”的年平均值,数据捕获阈值为 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"))  

我做错了什么?我总是可以使用循环,但我不认为这是要走的路。 谢谢!

【问题讨论】:

  • timeAverage(PM10val ,avg.time="year",data.thresh=75, statistic="mean") 究竟返回了什么?另外,出错后请提供traceback()的结果。
  • 我在上面的主要问题中添加了它。不好意思,第一次问问题!

标签: r aggregate plyr


【解决方案1】:

我建议改用ddplyPOSIXct 数据类型和 aggregate 存在一些问题。实际上,您的函数将 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)

【讨论】:

  • 我刚做了。但是,有一点要注意:选项“data.tresh=75”似乎不起作用。有少于6750个有效小时数据的站点,仍然计算年平均值。奇怪
  • @SandyAdriaenssens,没有ddply 可以吗?与timeAverage(data2, avg.time="year", data.thresh=75, statistic="mean")。有一条出路,您可以在使用 ddply 应用的函数中进行过滤。只需在timeAverage 行之前添加x &lt;- subset(x, mod &lt; 75)
  • 问题已解决:它应该是“data.thresh”而不是“data.tresh”。只是忘记了字母“h”。显然这没有错误,只是被忽略了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多