r - 如何考虑 R 中的纬度和经度值来计算两个不同变量的平均值?

标签 r latitude-longitude bioinformatics mean biometrics

我目前正在尝试从表中获取 R 中的一些数据。

我有一个包含两个不同变量的数据集,即全局海面温度 (SST) 的年范围和年平均值。我有每个纬度(从 90 到 -90)和经度(从 180 到 -180)级别的这些值。

我想获得 5x5 纬度/经度网格单元的上述变量的平均值(年范围和年平均值)。例如,我需要知道 -180 到 -176 之间的经度和 90 到 86 之间的纬度的“年度范围”平均值,依此类推,直到获得所有可能的 5x5 网格单元的该变量的平均值。

我的数据如下:

经纬度 ANNUAL_MEAN ANNUAL_RANGE 1 0.5 89.5 -1.8 0 2 1.5 89.5 -1.8 0 3 2.5 89.5 -1.8 0 4 3.5 89.5 -1.8 0 5 4.5 89.5 -1.8 0 6 5.5 89.5 -1.8 0 ... 52001 354.5 -89.5 -1.8 0 52002 355.5 -89.5 -1.8 0 52003 356.5 -89.5 -1.8 0 52004 357.5 -89.5 -1.8 0 52005 358.5 -89.5 -1.8 0 52006 359.5 -89.5 -1.8 0

提前谢谢

最佳答案

您可以使用raster包及其focal函数进行移动窗口的计算。

首先,我将创建一个代表您的数据的虚拟 data.frame

# Prepare dummy data.frame
set.seed(2222)
lonlat <- expand.grid(1:10, 1:10)
df <- data.frame( lon = lonlat[, 1],
                  lat = lonlat[, 2],
                  ANNUAL_MEAN = rnorm(100),
                  ANNUAL_RANGE = runif(100, 1, 5)
                )

现在我们必须将数据帧转换为栅格并执行移动窗口平均。

library(raster)

# Convert data frame to raster object
rdf <- df
coordinates(rdf) <- ~ lon + lat
gridded(rdf) <- TRUE
rdf <- brick(rdf) # our raster brick

## Perform moving window averaging

# prepare weights matrix (5*5)
w <- matrix(1, ncol = 5, nrow = 5)

# perform moving window averaging
ANNUAL_MEAN_AVG <- focal(rdf[[1]], w, mean, pad = TRUE, na.rm = TRUE)
ANNUAL_RANGE_AVG <- focal(rdf[[2]], w, mean, pad = TRUE, na.rm = TRUE)

# Append new data to initial data.frame
df$ANNUAL_MEAN_AVG <- as.data.frame(ANNUAL_MEAN_AVG)
df$ANNUAL_RANGE_AVG <- as.data.frame(ANNUAL_RANGE_AVG)

现在,df$ANNUAL_MEAN_AVGdf$ANNUAL_RANGE_AVG 中的每个单元格都包含相应 5*5 正方形的平均值。

UPD 1. 5x5 下采样

如果您需要固定的 5x5 网格单元以及每个单元的平均值,您可以使用 raster::agregate 函数。

使用上一个示例中的 rdf 栅格 block 。

# perform an aggregation with given downsampling factor
rdf_d <- aggregate(rdf, fact=5, fun = mean)

# Now each pixel in the raster `rdf_d` contains a mean value of 5x5 pixels from initial `rdf`
# we need to get pixels coordinates and their values
coord <- coordinates(rdf_d)
vals <- as.data.frame(rdf_d)
colnames(coord) <- c("lon", "lat")
colnames(vals) <- c("ANNUAL_MEAN_AVG", "ANNUAL_RANGE_AVG")

res <- cbind(coord, vals)

关于r - 如何考虑 R 中的纬度和经度值来计算两个不同变量的平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52495710/

相关文章:

distance - 给定(纬度,经度),距离和方位的点,如何获得新的纬度和经度

c++ - 这个 C++ 反序列化习惯用法是什么?使用整数 ID 变量调用文件读取器函数作为 `reinterpret_cast<char *>(&id)?`

r - 为什么我的 R 突变与 rowSums 不起作用(错误 : Problem with `mutate()` input `..2` . x 'x' 必须是数字 ℹ 输入 `..2` 是 `rowSums(.)` 。)?

r - 在 R 中使用函数参数定义全局变量

r - R 中日期向量的核密度估计

php - GreatCircle 和 mysql 查询

python - 下载仅在文件名中列出的纬度/经度数据

python - 如何在 Python 中比较不同的列表并从字典中导出值?

perl - 使用 perl 在 DNA 序列中查找核苷酸

r - 在R中如何合并列表