合并多维数组

Posted

技术标签:

【中文标题】合并多维数组【英文标题】:merge multi-dimensional arrays 【发布时间】:2015-01-14 00:20:21 【问题描述】:

我有一个数组列表,其中每个数组只有 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)

谢谢!

【问题讨论】:

澄清一下,输出应该是带有三个非 NA 值的暗淡 c(2, 3, 4) 数组? 在这种情况下是的。在实际情况下,所有值都将被填充。所以基本上我希望将 NA 替换为单个主阵列。 【参考方案1】:

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

> 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

【讨论】:

【参考方案2】:

您可以将Reduce 与任何忽略NAs 的矢量化函数一起使用:

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 - 就像这里的其他答案一样,我通常只在这些情况下使用 pmax - pmax(c(1, NA),c(NA, 2),na.rm=TRUE) 我不希望 1 %|% 2 返回 2。如果第一个值是NA,我想到的一般函数只会使用第二个值。例如x %|% 0 将用零替换x 中的所有NA。我在任何地方都使用ifelse 构造,并希望有一个二元运算符。 (我明白这不适用于这里,所以pmax 可以解决手头的问题)

以上是关于合并多维数组的主要内容,如果未能解决你的问题,请参考以下文章

合并多维数组

合并两个多维数组并重新索引所有子数组

合并复杂的多维数组

如何在php中通过键值合并两个多维数组?

合并一个多维数组中键的值相同的数组

将多维数组添加到其他多维数组的子数组中