如何结合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
相关产品推荐
相关产品推荐

