【问题标题】:average gridded climate data for duplicated times in rr 中重复时间的平均网格化气候数据
【发布时间】:2017-01-18 14:33:02
【问题描述】:

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

# 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),所以最后一个循环至少可以说不是很有效。

【问题讨论】:

    标签: r spatial weather


    【解决方案1】:

    我原来的答案:

    使用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 绕过该循环。

    【讨论】:

    • 是的,这非常有效。更好的是,有没有办法修改它,以便可以在第三维上使用聚合命令,即不必遍历所有不同的纬度/经度组合?您更新的答案是这样做的,但我认为必须有另一种解决方案。例如,可以使用 abind 合并数组的第三维,因此我认为类似的东西一定是可能的。目前,浏览我的数据仍需要一段时间 - 我正在尝试找到解决此问题的最佳方法。
    • @EmmaTebbs 很高兴它有效!让我看看我能不能得到你在评论中提到的最后一个改进。我会在今天的午餐时间(大约 6 小时后)回来讨论这个问题,看看我能做些什么。
    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多