You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合apply函数与条件语句实现3D数组指定维度的条件求和?

解决3D数组沿Z维度按条件求和的问题

首先先把你的数组定义正确写出来(R里赋值用<-,而且你的b数组元素不足,R会自动循环填充):

a <- array(1:27, dim = c(3,3,3))
b <- array(c(0,2,6,0), dim = c(3,3,3))

你之前的apply写法出现语法错误,主要是三个问题:

  • sum {if(b[b>0])}不是合法的函数形式,apply的第三个参数必须是一个完整的函数(有名或匿名)
  • 没有把当前处理的a的切片和对应位置的b的切片关联起来,直接用b[b>0]会取整个b数组的符合条件元素,而不是当前(i,j)位置的Z维度元素
  • if(b[b>0])的逻辑判断不成立,if需要单个逻辑值,而b[b>0]是一个向量

下面给你两种符合要求的实现方式,都是用标准函数结合apply:

方法一:用匿名函数关联对应位置的b切片

这种方式在apply的匿名函数里,明确获取当前(i,j)位置对应的a和b的Z维度向量,再筛选求和:

summed <- apply(a, c(1,2), function(x, i, j) {
  # x是当前(i,j)位置的a的Z维度向量
  b_slice <- b[i, j, ]
  sum(x[b_slice > 0])
}, i = 1:3, j = 1:3)

方法二:先创建掩码再求和(更简洁)

先生成一个和a维度相同的逻辑掩码,标记b中大于0的位置,然后将a和掩码相乘(不符合条件的元素变为0),最后沿Z维度求和:

# 创建逻辑掩码:b中大于0的位置为TRUE,否则为FALSE
mask <- b > 0
# 按(1,2)维度求和,此时不符合条件的元素已经被置为0
summed <- apply(a * mask, c(1,2), sum)

两种方法都能得到你想要的2D矩阵,比如验证第一个位置summed[1,1]:b[1,1,]是c(0,2,6),对应a[1,1,]的c(1,10,19),求和结果是10+19=29,和代码运行结果一致。

内容的提问来源于stack exchange,提问作者Elli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:52:27