【R言語】統計解析フリーソフトR 第6章【GNU R】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
array(1:48, dim=c(6, 4, 2))
を,3行2列おきに平均して
,,1
[,1] [,2]
[1,] 5 17
[2,] 8 20
,,2
[,1] [,2]
[1,] 29 41
[2,] 32 44
としたいんですが,効率的な方法はないでしょうか。
実際のデータは,10000x10000x400なんです。 >>154
>3行2列
さっぱりわからん。
例えば、結果の[1,1,1]の5は、どれとどれの平均? >>155
6行4列の左上の6つ1,2,3,7,8,9の平均5だと思う。 >>154
効率的かどうかはわからんが、やってみた
(d=array(1:48, dim=c(6, 4, 2)))
a=3
b=2
l=6
m=4
n=2
re=NULL
for(k in 1:n){
for(j in 1:(m/b)){
for(i in 1:(l/a)){
re=append(re,mean(d[1:3+3*(i-1),1:2+2*(j-1),k]))
}
}
}
array(re,dim=c(m/b,l/a,n)) >>155
>>154です。
説明が悪くてすみません。
>>156の通りです。 >>157
ありがとうございます。
手元にデータがないので明日試してみます。 なるほど、じゃあその5,8,17,20はこういうことか。
> a <- array(1:48, dim=c(6, 4, 2))
> b <- expand.grid(1:(dim(a)[1] %/% 3), 1:(dim(a)[2] %/% 2))
> f <- function(i, j, k=1){mean(a[(3*i-2):(3*i),(2*j-1):(2*j),k])}
> mapply(f, b[,1], b[,2])
[1] 5 8 17 20 あぁ、すでに >>157 が回答を書いていたorz > d=array(1:48, dim=c(6, 4, 2))
> a=3
> b=2
> l=6
> m=4
> n=2
> re=NULL
> for(k in 1:n){
+ for(j in 1:(m/b)){
+ for(i in 1:(l/a)){
+ re=append(re,mean(d[1:a+a*(i-1),1:b+b*(j-1),k]))
+ }
+ }
+ }
> array(re,dim=c(m/b,l/a,n))
, , 1
[,1] [,2]
[1,] 5 17
[2,] 8 20
, , 2
[,1] [,2]
[1,] 29 41
[2,] 32 44
データは10000x10000x400なら
l=10000
m=10000
n=400
でよくね? 最初の1行で
> d=array(1:(10000*10000*400))
Error: cannot allocate vector of size 298.0 Gb
エラーがでたw 正しいエラーwはこっち
> d=array(1:(10000*10000*400),dim=c(6, 4, 2))
Error: cannot allocate vector of size 298.0 Gb そもそも、10000x10000x400だと10000行は3行にならないな。最終行を無視して9999行にするのかな? >160を参考に>157のforだらけのスパゲティー・ソースを(ちょっと一般化して)改変しました。
(変数名の重複を避けるため>160の変数名は変更してあります。)
> a=3
> b=2
> c=1
>
> l=6
> m=4
> n=2
>
> A <- array(1:48, dim=c(l,m,n))
> B <- expand.grid(1:(l %/% a), 1:(m %/% b),1:(n %/% c))
> f <- function(i, j, k){mean(A[(a*(i-1)+1):(a*i),(b*(j-1)+1):(b*j),(c*(k-1)+1):(c*k)])}
> re=mapply(f, B[,1], B[,2],B[,3])
> array(re,dim=c(m%/%b,l%/%a,n%/%c))
, , 1
[,1] [,2]
[1,] 5 17
[2,] 8 20
, , 2
[,1] [,2]
[1,] 29 41
[2,] 32 44
>
上級者のコードを読むのは勉強になります。(深謝) 先輩方,>>154です。
巨細にわたってご教示・ご議論いただきありがとうございました。
>>166のコードを参考にして,無事処理することができました。
実行速度も申し分なく,効率的に作業が進められそうです。
今回は私には目から鱗な解法で,勉強になりました。
質問して良かったと思っています。。本当にありがとうございました。
10,000行の扱いですが,3行ごとに処理して1行無視してもよいし,
4から7行程度で処理してもよく,フレキシブルです。
今回は4行にして余りなしにしました。 ■ このスレッドは過去ログ倉庫に格納されています