2017-11-29 16 views
0

私はプログラムrで作業していて、コードを書くのに助けが必要です。私は50×3×8次元の配列を持っています。この配列内のほとんどのセルはゼロですが、いくつかはNAです。配列内のゼロを、行内のすべてのセルが同じ数になるように一連の番号に置き換える必要があります。シーケンスは1から始まり、配列内の合計行数まで実行されます。また、NAsは残っていなければならないため、NAsを持つセルは上書きできません。さらに、一部の行はすべてNAsなので、行の順序は正確には400(50×8)ではありませんが、それよりも小さくなります。私はこの問題の各部分にどのように対処するかについての情報を見つけましたが、すべての作品をうまく組み合わせるために苦労しています。私はこのrコードを書くあなたの助けに大変感謝します。
例、このアレイ用:
Y < -array(0、DIM = Cの(10,3,2))
#addのNA
Y [4,2:3,1] < -NA
Y [8,1:3,1] < -NA
Y [10,1:3,2] < -NA
Iは、配列内の最初の行列は、その行を有するように配列と0を交換する必要があります1〜9の番号を付けます(行1のすべてのセルは1,2 = 2などとなり、NAsはそのまま残ります)。行列2は10から18の番号の行を持っています。配列を行番号順に並べて表示する

+2


アドレッシング編集は、さらに2つの方法を疑問視します。私はあなたが、例えば4x3値の単純な2次元配列でも問題を説明できると仮定します。また、「問題の各部分に対処する方法に関する情報」に関して、より具体的に言えば、このためのリンクを使用することができます。 – maschu

答えて

0

私が言うことができる限り、これはあなたの望むものです(イラストの小規模)。

## Set up example data 
## (you should provide something like this in your question!!) 
set.seed(47) 
d = c(5, 2, 3) 
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d) 
# set a row to all na: 
x[2, , ] = NA 

まず、すべてNAではない行を見つけ、置換シーケンスを計算します。それから、単純なforループで置き換えます。

r = ! apply(is.na(x), MARGIN = 1, all) 
rows = which(r) 
rn = seq_along(r[r]) 

for (i in seq_along(rows)) { 
    x[rows[i], , ][x[rows[i], , ] == 0] = rn[i] 
} 

x 
# , , 1 
# 
#  [,1] [,2] 
# [1,] NA NA 
# [2,] NA NA 
# [3,] NA 2 
# [4,] NA NA 
# [5,] NA NA 
# 
# , , 2 
# 
#  [,1] [,2] 
# [1,] 1 NA 
# [2,] NA NA 
# [3,] 2 2 
# [4,] NA 3 
# [5,] NA 4 
# 
# , , 3 
# 
#  [,1] [,2] 
# [1,] 1 1 
# [2,] NA NA 
# [3,] NA 2 
# [4,] 3 NA 
# [5,] NA NA 

これがあなたの望むものでない場合は、サンプル入力とそれに対応する出力を提供してください。醜い理解しやすい方法とまったくあまりにも賢い方法:それは正確にあなたが目指しているものの小さな例を提供するために役立つだろう

# sample data 
set.seed(47) 
d = c(5, 2, 3) 
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d) 

# nested for loopsr 
r = !apply(is.na(x), c(1, 3), all) 
counter = 0 
for (k in 1:dim(x)[3]) { 
    for (i in 1:dim(x)[1]) { 
     if(r[i, k]) { 
      counter = counter + 1 
      x[i, , k] = x[i, , k] + counter 
     } 
    } 
} 
x 

# now the clever way 
# reset the data 
set.seed(47) 
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d) 

xm = matrix(aperm(x, c(1, 3, 2)), ncol = 2) 
axm = ! apply(is.na(xm), 1, all) 
xm = xm + cumsum(axm) 
aperm(array(c(xm), dim = d[c(1, 3, 2)]), c(1, 3, 2)) 
# , , 1 
# 
#  [,1] [,2] 
# [1,] NA NA 
# [2,] 1 1 
# [3,] NA 2 
# [4,] NA NA 
# [5,] NA NA 
# 
# , , 2 
# 
#  [,1] [,2] 
# [1,] 3 NA 
# [2,] NA 4 
# [3,] 5 5 
# [4,] NA 6 
# [5,] NA 7 
# 
# , , 3 
# 
#  [,1] [,2] 
# [1,] 8 8 
# [2,] NA 9 
# [3,] NA 10 
# [4,] 11 NA 
# [5,] NA NA 
+0

ありがとうございます。これはほとんど私が探しているものですが、数値シーケンスは配列内の行列間で継続し、各行列で新しいシーケンスを開始する必要はありません。あなたの例では、行列1は配列の行1を持ち、行列2は2から5の番号の行を持ち、行列3の行は6から8の番号をつけています。 – Lat68

+0

配列の最初の行列のセルが"1"ではなく "2"?それがなぜここで「2」になるのか分かりません。あなたのご意見ありがとうございます。 – Lat68

+0

最初の行 'a [1、、] 'の0が1になるので、' a [2、]] 'はすべて抜けていますので、' a [3、 2を得る(私が元々あなたの問題をどのように解釈したか)。 – Gregor

関連する問題