r - r 中重复时间的平均网格气候数据

标签 r spatial weather

我有一个网格气候数据集,例如:

# generate time vector
time1 <- seq(14847.5,14974.5, by = 1)
time2 <- seq(14947.5,14974.5, by = 1)
time <- c(time1,time2)
time <- as.POSIXct(time*86400,origin='1970-01-01 00:00')

# generate lat and lon coordinates
lat <- seq(80,90, by = 1)
lon <- seq(20,30, by = 1)

# generate 3dimensional array
dat <- array(runif(length(lat)*length(lon)*length(time)),
             dim = c(length(lon),length(lat),length(time)))

这样

> dim(dat)
[1]  11  11 156

数据的维度描述了不同经度 ( dim = 1 )、纬度 ( dim = 2 ) 和时间 ( dim = 3 ) 的变量。

我目前遇到的问题是,有些时间会重复,这与测量数据的重叠传感器有关。因此,我想知道是否可以只保留 dat 的唯一时间。 ,但对网格内重复次数的数据进行平均,即如果有两天重复,我们将取该时间每个纬度和经度网格中的平均值。

我可以找到独特的时间:

# only select unique times
new_time <- unique(time)
unique_time <- unique(time)

然后,以下代码旨在循环遍历每个网格( lat/lon )并对所有重复的天数进行平均。

# loop through lat/lon coordinates to generate new data
new_dat <- array(dim = c(length(lon),length(lat),length(new_time)))
for(i in 1:length(lon)){
  for(ii in 1:length(lat)){
    dat2 <- dat[i,ii,]
    dat2b <- NA
    for(k in 1:length(unique_time)){
      idx <- time == unique_time[k]
      dat2b[k] <- mean(dat2[idx], na.rm = TRUE)
    }
    new_dat[i,ii,] <- dat2b
  }
}

我确信这提供了正确的答案,但我确信有一种更简洁的方法可以实现这一点。

我还应该注意,我的数据非常大(即 k = 7000 ),因此至少可以说,最后一个循环效率不是很高。

最佳答案

我原来的答案:

通过使用aggregate,这会更加简洁和高效:

for(i in 1:length(lon)){
  for(ii in 1:length(lat)){
    new_dat[i,ii,] <- as.numeric(aggregate(dat[i,ii,], by=list(time),mean)$x)
  }
}

它仍然有 3 个循环中的 2 个,但它设法绕过创建 dat2dat2bunique_time

我改进的答案:

f <- function(i, ii){as.numeric(aggregate(dat[i,ii,], by=list(time),mean)$x)}

for(i in 1:nrow(expand.grid(1:length(lon),1:length(lat)))){
  new_dat[expand.grid(1:length(lon),1:length(lat))[i,1],
          expand.grid(1:length(lon),1:length(lat))[i,2],] <- 
    f(expand.grid(1:length(lon),1:length(lat))[i,1],expand.grid(1:length(lon),
           1:length(lat))[i,2])
}

将其减少到只有 1 个循环。我们也可以通过 apply 绕过该循环。

关于r - r 中重复时间的平均网格气候数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428544/

相关文章:

MySQL 空间搜索 HSV(颜色)值?

JQuery 插件帮助

api - 如何使用 Dark Sky Forecast API 中的查询参数?(forecast.io)

linux - Bash:使用 Wgrib2 时语法错误接近意外标记 `('

r - 如何导入.ods?

r - 如何修复拥挤的 tmap 图例中的垂直空间 [R]

r - R中的邻近空间过滤

sql-server - 如何在 SQL Server 中进行空间重投影

r - 如何在R中生成0和1之间没有0和1的随机数?

r - 带 dplyr 的条件 rowMeans