填充或移动多维阵列

时间:2016-05-04 14:30:50

标签: r

我怎样才能简单地将NA的一片A <- array(1:8,c(2,2,2)) 填充(附加/前置)到(比方说)尺寸2的(例如)3D数组?

假设初始数组为

cbind(A,NA)

我最初认为这会奏效:

abind(A,NA,along=2)

但它会产生8x2矩阵而不是2x3x2阵列。然后我尝试了

dimSlice <- dim(A)
dimSlice[2] <- 1
abind(A,array(NA,dimSlice),along=2)

但这会导致错误。

我希望有一个比

更简单的解决方案
NA

背景

此填充发生在&#34;删除切片和垫对面的一部分&#34;将数组沿某个维度移动一个位置的操作,在空出位置填充c(A[-1],NA)个元素。例如,对于向量A,一维等价物将是{{1}},如果有一种简单的方法可以在没有显式填充子操作的情况下完成这样的操作,那就更好了。 / p>

1 个答案:

答案 0 :(得分:3)

使用NA s进行子集导致NA s(?Extract):

v = 1:3; m = matrix(1:4, 2, 2); a = array(1:6, c(2, 2, 2))
v[c(NA, 1)]
#[1] NA  1
m[, c(2, NA)]
#     [,1] [,2]
#[1,]    3   NA
#[2,]    4   NA
a[, c(1, 2, NA), ]
#, , 1
#
#     [,1] [,2] [,3]
#[1,]    1    3   NA
#[2,]    2    4   NA
#
#, , 2
#
#     [,1] [,2] [,3]
#[1,]    5    1   NA
#[2,]    6    2   NA

因此,要填充NA s,我们可以使用适当的索引进行子集化。将上述内容放在更一般的功能中,以附加/前置&#34; n&#34;维度为NA的索引&#34; k&#34;数组:

pad = function(x, k, n = 1L, append = TRUE)
{
    dims = replicate(length(dim(x)), substitute(), simplify = FALSE)
    if(append) dims[[k]] = c((n + 1):dim(x)[[k]], rep_len(NA, n))
    else dims[[k]] = c(rep_len(NA, n), 1:(dim(x)[[k]] - n))
    do.call("[", c(list(x), dims))
}

arr = array(1:24, c(3, 2, 2, 2))
pad(arr, 1, 2, FALSE)
pad(arr, 2)