次の問題をエレガントに解決する方法についての提案を探しています。私の特定のケースではパフォーマンスは問題ではありませんが、良い慣行に関するコメントをいただければ幸いです。
前もって感謝します!
短いバージョン:
NaN 値を無視しながら、いくつかのロジックに従って行列の行を平均化しようとしています。私が現在持っているコードは、NaN 値を希望どおりに処理しません。
長いバージョン:
私のデータは次の方法で構築されています。
- 「ビン」の 1 つの (最初の) 列。各ビンの行数は一定ではありません。ビンは整数である必要はありません。行は事前にソートされています。
- おそらく NaN を含む可変数のデータ列。
次に例を示します。
DATA = [...
180 NaN NaN 1.733
180 NaN NaN 1.703
200 0.720 2.117 1.738
200 0.706 2.073 1.722
200 0.693 2.025 1.723
200 NaN NaN 1.729
210 NaN NaN 1.820
210 NaN NaN 1.813
210 NaN NaN 1.805
240 NaN NaN 1.951
240 NaN NaN 1.946
240 NaN NaN 1.946
270 NaN NaN 2.061
270 NaN NaN 2.052
300 0.754 2.356 2.103
300 0.758 2.342 2.057
300 NaN NaN 2.066
300 NaN NaN 2.066 ];
望ましい結果は、最初の列に一意の「ビン」を含む行列であり、残りは「NaN によって損なわれていない」ことを意味します。たとえば、次のようになります。
- 特定の列 + ビンに NaN しかない場合 (上記の例では、最初のデータ列 + ビン 210)、結果は NaN になります。
- 特定の列とビンに NaN と数値が混在している場合、結果は有効な数値の平均になります。上記の例: 1 番目のデータ列 + ビン 200 が与える必要があります
(0.720+0.706+0.693)/3=0.7063
-- この列 + ビンの 3 (4 ではなく) による除算に注意してください。
上記の例の望ましい結果は次のとおりです。
RES = [...
180 NaN NaN 1.718
200 0.7063 2.072 1.728
210 NaN NaN 1.812
240 NaN NaN 1.948
270 NaN NaN 2.056
300 0.756 2.349 2.074 ];
私がこれまでに試したこと:
これは、いくつかのソースからコンパイルできたコードです。NaNまたは数値のみを含む列+ビンでうまく機能しています。
nDataCols=size(DATA,2)-1;
[u,m,n] = unique(DATA(:,1));
sz = size(m);
N=accumarray(n,1,sz);
RES(length(u),nDataCols) = 0; %Preallocation
for ind1 = 1:nDataCols
RES(:,ind1)=accumarray(n,DATA(:,ind1+1),sz)./N;
end
RES= [u,RES];
これが私が現在得ているものです:
RES = [...
180 NaN NaN 1.718
200 NaN NaN 1.728
210 NaN NaN 1.812
240 NaN NaN 1.948
270 NaN NaN 2.056
300 NaN NaN 2.074 ];
ps
- 万が一、スプレッドシート ソフトウェア (MS Excel など) を使用したほうが簡単な場合は、アイデアをお待ちしております。
- 列ごとに計算を行うことは、これを処理する方法に関する私の現在の考えです。完全なマトリックスをすぐに取得するために一般化する方法があるかどうか疑問に思っていました。