首页 文章

从空间(纬度/经度)数据定义网格框并提取R中的平均值

提问于
浏览
0

我想通过定义经度/纬度网格框来计算我定义的数据区域的空间平均值 .

我的数据是ECMWF海冰数据,因此它是整个北半球每个.75x.75 lon / lat坐标的时空数据 . 我已经将数据从NetCDF格式更改为R数据帧,因此head(var.df)看起来像这样:列,日期,经度,纬度,值

date_time lon   lat ci
1 2016-01-01 18:00:00   0 87.75  1
2 2016-01-02 18:00:00   0 87.75  1
3 2016-01-03 18:00:00   0 87.75  1
4 2016-01-04 18:00:00   0 87.75  1
5 2016-01-05 18:00:00   0 87.75  1
6 2016-01-06 18:00:00   0 87.75  1

因此,北半球的每个lon / lat坐标都有一个值(df按日期排序,而不是由于某种原因而排序) .

我如何提取我想要的空间区域,即

BK <- subset(var.df,lon <= 30 & lon >= 105 & lat >= 70 & lat <= 80)

然后平均每个时间步(天)内该区域内的所有值?所以我有一个我定义的网格箱的意思 .

在此先感谢,我希望这不是非常严厉 .

Update

使用下面的GGamba建议代码,我得到了以下输出,同一天有多个值,因此它没有按时间片平均整个区域 .

date_time  binlat  binlon      mean
                <dttm>  <fctr>  <fctr>     <dbl>
1  2016-01-01 18:00:00 [80,90)  [0,10) 0.4200042
2  2016-01-01 18:00:00 [80,90) [10,20) 0.4503899
3  2016-01-01 18:00:00 [80,90) [20,30) 0.5614429
4  2016-01-01 18:00:00 [80,90) [30,40) 0.6118528
5  2016-01-01 18:00:00 [80,90) [40,50) 0.5809092
6  2016-01-01 18:00:00 [80,90) [50,60) 0.5617919
7  2016-01-01 18:00:00 [80,90) [60,70) 0.6071370
8  2016-01-01 18:00:00 [80,90) [70,80) 0.6011818
9  2016-01-01 18:00:00 [80,90) [80,90] 0.5442770
10 2016-01-01 18:00:00 [80,90)      NA 0.4120862
# ... with 610 more rows

我还必须在最后添加na.rm = TRUE到mean()函数,因为平均值是NA .

1 回答

  • 0

    使用 dplyr 我们可以这样做:

    library(dplyr)
    df %>% 
        mutate(binlon = cut(lon, seq(from = min(lon), to = max(lon), by = .75), include.lowest = T, right = F),
               binlat = cut(lat, seq(from = min(lat), to = max(lat), by = .75), include.lowest = T, right = F)) %>% 
        group_by(date_time, binlat, binlon) %>% 
        summarise(mean = mean(ci))
    

    数据:

    structure(list(date_time = structure(1:6, .Label = c("2016-01-01 18:00:00", 
    "2016-01-02 18:00:00", "2016-01-03 18:00:00", "2016-01-04 18:00:00", 
    "2016-01-05 18:00:00", "2016-01-06 18:00:00"), class = "factor"), 
        lon = c(0L, 0L, 0L, 0L, 0L, 90L), lat = c(0, 87.75, 87.75, 
        87.75, 87.75, 90), ci = c(1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("date_time", 
    "lon", "lat", "ci"), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))
    

    结果:

    #             date_time      binlat    binlon  mean
    #                <fctr>      <fctr>    <fctr> <dbl>
    # 1 2016-01-01 18:00:00    [0,0.75)  [0,0.75)     1
    # 2 2016-01-02 18:00:00 [87.8,88.5)  [0,0.75)     1
    # 3 2016-01-03 18:00:00 [87.8,88.5)  [0,0.75)     1
    # 4 2016-01-04 18:00:00 [87.8,88.5)  [0,0.75)     1
    # 5 2016-01-05 18:00:00 [87.8,88.5)  [0,0.75)     1
    # 6 2016-01-06 18:00:00   [89.2,90] [89.2,90]     1
    # 6 2016-01-06 18:00:00 [80,90) [0,10)     1
    

    这将创建两个新列,将 latlon 合并到 cut 函数中定义的bin中 .
    然后按 date_time 和新列分组并计算组上的 ci 均值 .

    当然,您应该调整 cut 功能以满足您的需要 .

相关问题