背景:最近在处理ERA5气象数据,下载后的数据为nc格式,具体数据结构是3维数组,分别代表经度,纬度和时间。我需要提取其中部分经纬度的所有值,即不同“行(维度1)”,“列(维度2)”中的所有“层(维度3)”
比如我需要提取三个地址的数据
library(data.table)
address <- data.table(lon=c(1,4,5),lat=c(5,3,4))#每行代表一个地址的经纬度
我原来的策略是
a <- array(1:100,c(5,5,4))#a表示ERA5数据
b <- a[address$lon, address$lat,]#b是目标提取数据
显然这样一共匹配了3×3条数据,提取了相当一部分无用数据,且随着点的数量增多,这一冗余将会给内存带来沉重负担。如何精确的找到这三个点而不是提取一个矩形呢?我在参考了chatGPT的回答后有了一些新的想法。
address <- as.matrix(address)
list1 <- split(address, seq_len(nrow(address)))#将每一个经纬度分别储存为列表
b <- lapply(list1, function(idx) a[idx[1], idx[2], ])#b为提取数据存储的列表
library(dplyr)
d <- Reduce(c, b) %>% matrix(ncol=length(list1)) %>% t #得到3行的矩阵
最后就是和原来的经纬度拼接,等待使用啦!这样就解决了冗余的数据
result <- cbind(address,d) %>% as.data.table