在R语言中如何提取与降水最大值对应时刻的温度数据?
解决方案(R语言)
假设你的降水数组precip和温度数组temp维度一致,最后一维代表小时(比如维度为[站点数, 天数, 小时数]),可以按以下步骤实现需求:
1. 定位降水最大值对应的小时索引
使用apply()函数对除最后一维外的所有维度批量处理,每个维度组合下用which.max()找到降水最大值所在的小时位置:
# 构造示例数组(3个站点、2天、24小时) set.seed(123) precip <- array(rnorm(3*2*24, mean=5), dim = c(3, 2, 24)) temp <- array(rnorm(3*2*24, mean=20), dim = c(3, 2, 24)) # 获取每个(站点, 日期)组合下,降水最大值的小时索引 max_hour_idx <- apply(precip, MARGIN = 1:(length(dim(precip))-1), which.max)
MARGIN = 1:(length(dim(precip))-1):指定对前n-1维(这里是站点、日期)进行遍历,每个遍历单元是该组合下的所有小时降水数据。which.max():返回当前单元中最大值的第一个出现位置(如果有多个相同最大值,只会取第一个)。
2. 提取对应时刻的温度数据
将第一步得到的小时索引转换为数组的完整下标,再用该下标提取温度数据:
# 生成前n-1维的所有位置下标 dim_indices <- arrayInd(1:length(max_hour_idx), dim(max_hour_idx)) # 组合成完整的三维下标矩阵(站点, 日期, 小时) full_indices <- cbind(dim_indices, as.vector(max_hour_idx)) # 提取对应温度并恢复维度 temp_max_hour <- temp[full_indices] dim(temp_max_hour) <- dim(max_hour_idx)
最终temp_max_hour的维度和max_hour_idx一致(示例中是3×2),每个值对应对应站点、日期下,降水最大时刻的温度。
补充:处理多个最大值的情况
如果需要保留所有降水最大值对应的温度(而非仅第一个),可以把which.max()替换为自定义函数:
# 获取所有最大值的小时索引(返回列表) all_max_hour_idx <- apply(precip, MARGIN = 1:(length(dim(precip))-1), function(x) which(x == max(x))) # 提取所有对应温度(结果为列表,每个元素是该组合下的温度向量) temp_all_max_hour <- mapply(function(idx, pos) temp[pos[1], pos[2], idx], all_max_hour_idx, split(dim_indices, 1:nrow(dim_indices)))
内容的提问来源于stack exchange,提问作者MP.
相关产品推荐
相关产品推荐

