如何基于数据框x,y对高效提取R语言3D数组的维度值?
R语言高效提取3D数组指定位置数据的方法
现有一个形状为[x=16, y=80, t=148]的3D数组:
a <- array(runif(16*80*148), dim = c(16, 80, 148))
同时有一个包含50行(带ID)的数据框,每行对应一组x,y坐标:
df <- data.frame(id = seq(1:50), x = floor(runif(50, 1,16)), y = floor(runif(50, 1, 80)))
需要根据df中的x,y对,从a中提取对应位置的t维度数据,生成形状为[50, 148]的2D数组,替代手动循环rbind的低效写法。
以下是几种高效实现方法:
方法1:矩阵式索引(最优效率)
R的数组支持用矩阵作为索引,矩阵每行对应数组前两个维度的位置。通过构造x,y索引矩阵,可直接提取所有目标数据,再转置调整形状:
# 构造包含x、y坐标的索引矩阵 idx_matrix <- cbind(df$x, df$y) # 提取数据并转置,得到n行t列的结果 output <- t(a[idx_matrix, ])
原理:a[idx_matrix, ]会返回t×n的矩阵,转置后正好符合n×t的目标形状,全程是向量化操作,没有显式循环,效率最高。
方法2:apply遍历(直观但效率稍低)
如果更偏好直观的写法,可以用apply遍历数据框的x,y列,提取对应位置的t维度数据后合并:
output <- t(apply(df[, c("x", "y")], 1, function(pos) a[pos[1], pos[2], ]))
注意:这种方法本质是隐式循环,数据量较大时效率不如矩阵索引。
方法3:abind包拼接(可选)
若需处理更复杂的维度组合,可借助abind包的abind函数,但对当前场景来说略显冗余:
library(abind) output <- abind(lapply(1:nrow(df), function(i) a[df$x[i], df$y[i], ]), along = 1)
内容的提问来源于stack exchange,提问作者DarwinsBeard
相关产品推荐
相关产品推荐

