合并多维数组

3

我有一个数组列表,每个数组只有2个元素是数字,其他为NA。在所有的数组中,对于任何给定的元素只有1个数字。

以下是一些示例数据。

ar1=array(NA,dim=c(2,3,4))
ar1[1,1,1]=100
ar2=array(NA,dim=c(2,3,4))
ar2[2,3,4]=200
ar3=array(NA,dim=c(2,3,4))
ar3[2,1,4]=300
ar=list(ar1,ar2,ar3)

谢谢!


请澄清一下,输出应该是一个维度为 c(2, 3, 4) 的数组,其中包含三个非 NA 值? - flodel
在这种情况下是的。在实际情况中,所有值都将被填充。因此,基本上我正在寻找将NAs替换为单个主数组的方法。 - Dominik
2个回答

5

pmax有一个na.rm参数,您可以将ar作为列表与该参数一起传递给pmax和do.call:

> do.call(pmax, c(ar,  na.rm=TRUE) )
, , 1

     [,1] [,2] [,3]
[1,]  100   NA   NA
[2,]   NA   NA   NA

, , 2

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA

, , 3

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA

, , 4

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]  300   NA  200

3
您可以使用任何忽略 NA 的向量化函数,结合 Reduce 使用:
Reduce(function(x, y) ifelse(!is.na(x), x, y), ar)

另一个例子:

library(functional)
Reduce(Curry(pmax, na.rm = TRUE), ar)

作为一个旁注,我真的希望上面的第一个匿名函数可以作为默认的二元运算符之一。你可以通过执行"%|%" <- function(x, y) ifelse(!is.na(x), x, y)来创建一个。然后可以像这样做:c(1, NA) %|% c(NA, 2) - flodel
@flodel - 像其他答案一样,我通常在这些情况下只使用 pmax - pmax(c(1, NA),c(NA, 2),na.rm=TRUE) - thelatemail
我不希望 1 %|% 2 返回 2。我想要的通用函数只有在第一个值为 NA 时才使用第二个值。例如,x %|% 0 将把 x 中的所有 NA 替换为零。我在任何地方都使用 ifelse 结构,并希望有一个二元运算符代替它。(我知道这里不适用,所以对于手头的问题,pmax 是可以的) - flodel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接