r

时间:2016-09-10 17:07:28

标签: 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),所以最后一个循环效率不高,至少可以说。

1 个答案:

答案 0 :(得分:3)

我原来的回答:

使用dat2

,这样更简洁有效
dat2b

它仍然有3个循环中的2个,但它设法绕过创建unique_timef <- 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]) } apply

我改进了答案:

{{1}}

归结为只有1个循环。我们可能会使用{{1}}绕过该循环。