R语言 多维数组中检索数据的问题解决

背景:最近在处理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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值