Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从空间(lat/long)数据定义一个网格框,并提取R中的平均值_R_Spatial_Netcdf - Fatal编程技术网

从空间(lat/long)数据定义一个网格框,并提取R中的平均值

从空间(lat/long)数据定义一个网格框,并提取R中的平均值,r,spatial,netcdf,R,Spatial,Netcdf,我想通过定义经度/纬度网格框来计算我定义的数据区域的空间平均值 我所拥有的数据是ECMWF海冰数据,所以它是整个北半球每个.75x.75lon/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

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

我所拥有的数据是ECMWF海冰数据,所以它是整个北半球每个.75x.75lon/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按日期排序,而不是出于某种原因按lon排序)

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

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

BK=70&lat使用
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))
数据: 结果:
#日期(时间)
#                           
# 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
这将创建两个新列,将
lat
lon
装箱到
cut
功能中定义的箱子中。
然后按
date\u time
和新列分组,并计算该组的
ci
平均值


当然,您应该调整
cut
函数以满足您的需要。

感谢您花时间回答,GGamba只是想知道为什么cut()函数中有3个值(80180,10),最后的值是什么(10)值为?此外,它没有每天返回一个值-我在原始问题中上传了输出。对于第一个问题:3个值在
seq
函数中,它创建了一个从第一个值到最后一个值的序列,由第三个值步进。
cut
将变量划分为由该序列定义的容器。cfr<代码>?cut
?seq
。至于第二个,我可能不明白你需要什么。我以为你需要每个“正方形”和每天的平均值。代码假设每天只有一个测量值,在18:00,你没有另外指定。每个位置每天都有多个观测值吗?是-抱歉-绝对值这是我解释的错误。这是网格数据,所以是一个值(ci)对于北半球的每个lon/lat坐标,因此每天只有1次观测,但由于其分辨率为.75x.75,因此需要在多个位置进行观测。我只需要获得整个网格框的一个平均值,我定义了该坐标。是否有办法将数据上传到此处,或数据的一个子集?在中更改值
cut
功能适合您的需要。我将答案更新为一些更合理的值,但我鼓励您阅读
?seq
?cut
,了解它们的工作原理。
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