2016-05-04 7 views
2

NAのスライスを次元(次元)2に沿って3D配列に単純に追加(または追加)することはできますか?多次元配列のパディングまたはシフト

cbind(A,NA) 

それは代わり2x3x2アレイの8×マトリックスをもたらす:

初期アレイは

A <- array(1:8,c(2,2,2)) 

として与えられると仮定私は当初、これが働くだろうと思いました。私は試しました

abind(A,NA,along=2) 

しかし、それはエラーになります。

Iは

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

背景

よりもはるかに簡単な解決策がある。このパディングは、一つの位置によってアレイをシフト「スライス及びパッド反対側を削除する」動作の一部として発生し望んでいますいくつかの次元に沿って、空いた位置にNA要素で記入する。ベクトルAの場合、1次元の等価物は、例えば、c(A[-1],NA)となります。明示的なパディングサブオペレーションなしでこのような操作を行う簡単な方法があれば、さらに良いでしょう。 NA S(?Extract)でNAの結果と

+2

おそらく、あなたはNA' 'とサブセットだろうか? 'A [、c(1:dim(A)[2]、NA)、]'となります。それはあなたの "取り外しとパッド"に合っていますか? –

+0

@alexis_lazだから、私は 'A [、c(2:ncol(A)、NA)、]'と左にシフトします。それは完璧だと思われる。それを答えに入れることができますか? – Museful

答えて

3

サブセットは:

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のパッドに、我々は適切なインデックスを使用してサブセットができました。 /プリペンド「n」は、配列の次元のNAと指数「K」を追加するために、より一般的な機能に上記を置く:

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) 
+1

@tennenrishin私はこの機能に対して何も持っていません。しかし、誰かがコメントを読まずにこの答えを見ていると、ここで何が起こっているのかわかりません(私は、コメントを読んで*混乱していました)。これは私の視点から見ると非常に質の低い回答です。 – eddi

+0

@eddi改善できますか? – Museful

+0

@eddi:あなたはより広範な説明を参照していますか?あなたはおそらく正しいでしょう。 –