ある列の値をすべてNaNに置換する方法

31 次查看(过去 30 天)
SH
SH 2018-8-2
m行n列の行列Aにおいて、i(1≦i≦n)列に含まれる数値をすべてNaNに置換した行列Bを作成する方法を教えてください。 なお、Aのi列には数値またはNaNが格納されています。

采纳的回答

Hiroumi Mita
Hiroumi Mita 2018-8-6
セル配列を使うことで、文字列と数値の混在したデータを作ることができます。
%xlsの読み込み
[num,txt,raw]=xlsread('Book1.xls')
%数値扱い
B=num
B(:,1)=NaN
%セル配列扱い Braw=raw Braw(2:5,1)={'NaN'}
Braw = 5×4 の cell 配列
{'u1' } {'u2' } {'u3' } {'u4' }
{'NaN'} {[0.6991]} {[0.1386]} {[0.2543]}
{'NaN'} {[0.8909]} {[0.1493]} {[0.8143]}
{'NaN'} {'NaN' } {[0.2575]} {[0.2435]}
{'NaN'} {[0.5472]} {'NaN' } {[0.9293]}

更多回答(6 个)

Hiroumi Mita
Hiroumi Mita 2018-8-2
以下ではどうでしょうか?
%例
A=rand(4)%Aは成分乱数,4*4の行列
B=A%AをBにコピー
B(1,:)=NaN%Bの1行目全列をNaNに書き換え
%注':'ワイルドカード 全ての意味
A =
0.7952 0.6463 0.6797 0.4984
0.1869 0.7094 0.6551 0.9597
0.4898 0.7547 0.1626 0.3404
0.4456 0.2760 0.1190 0.5853
B =
NaN NaN NaN NaN
0.1869 0.7094 0.6551 0.9597
0.4898 0.7547 0.1626 0.3404
0.4456 0.2760 0.1190 0.5853

Hiroumi Mita
Hiroumi Mita 2018-8-2
列番号で指定するほうが簡単だと思いますが
次のようなプログラムで、ラベル名を探し出してその列を一括書き換えするようなことは可能です。
%xlsの読み込み
[num,txt,raw]=xlsread('Book1.xlsx')
num =
1 11
2 12
3 13
4 14
5 15
txt =
1×2 cell 配列
'u' 'y'
raw =
6×2 cell 配列
'u' 'y'
[1] [11]
[2] [12]
[3] [13]
[4] [14]
[5] [15]
%txtの文字列が'y'の列番号を探しそれをNとする
N=find(strcmp(txt,'y')==1)
data(:,N)=NaN %N列を全部NaNにする
data =
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN

SH
SH 2018-8-2
回答有り難うございます。 MATLABにデータをインポートした際に、列にラベル(例えばラベル名'Label')を付けているのですが、列番号をラベル名で指定することはできるでしょうか。それとも、列番号で指定しなければならないのでしょうか。

SH
SH 2018-8-2
ありがとうございます。 列の番号で指定した方がシンプルになりそうですね。
ただ、列の番号を用いて同様のコードを書いてプログラムを実行すると、 「テーブルへの代入文の右辺は、別のテーブルかセル配列でなければなりません」 というエラーが出てきてしまいます。
これは、もとのデータに既にNaNが含まれる行が存在したからでしょうか。 NaNと数値が含まれる列を、全ての行についてNaNに置換する場合は別の方法が必要なのでしょうか。

Hiroumi Mita
Hiroumi Mita 2018-8-2
以下のようにxlsから読んだデータの数値numを用いればだいじょうぶでしょう。
[num,txt,raw]=xlsread('Book1.xls')
B=num %数値データnumをBに代入<-ココ
B(:,1)=NaN
num =
NaN 0.6991 0.1386 0.2543
0.7513 0.8909 0.1493 0.8143
0.2551 NaN 0.2575 0.2435
0.5060 0.5472 NaN 0.9293
txt =
5×4 cell 配列
'u1' 'u2' 'u3' 'u4'
'NaN' '' '' ''
'' '' '' ''
'' 'NaN' '' ''
'' '' 'NaN' ''
raw =
5×4 cell 配列
'u1' 'u2' 'u3' 'u4'
'NaN' [0.6991] [0.1386] [0.2543]
[0.7513] [0.8909] [0.1493] [0.8143]
[0.2551] 'NaN' [0.2575] [0.2435]
[0.5060] [0.5472] 'NaN' [0.9293]
B =
NaN 0.6991 0.1386 0.2543
0.7513 0.8909 0.1493 0.8143
0.2551 NaN 0.2575 0.2435
0.5060 0.5472 NaN 0.9293
B =
NaN 0.6991 0.1386 0.2543
NaN 0.8909 0.1493 0.8143
NaN NaN 0.2575 0.2435
NaN 0.5472 NaN 0.9293

SH
SH 2018-8-2
ありがとうございます。 ご教示いただいた方法だと行列Bにラベルがついていない数値のみのデータなのですが、Bにラベルを振り直すことはできるでしょうか。もしくは、列のラベルがついたまま値をNaNに置換することはできるでしょうか。
以降のコードで列のラベルを使用するので、できればラベルを残したまま値の置換をしたいと考えています。

类别

Help CenterFile Exchange 中查找有关 cell 配列 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!