合并多维数组
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
与任何忽略NA
s 的矢量化函数一起使用:
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
可以解决手头的问题)以上是关于合并多维数组的主要内容,如果未能解决你的问题,请参考以下文章