MATLAB Answers

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

60 views (last 30 days)
SH
SH on 2 Aug 2018
Answered: Hiroumi Mita on 6 Aug 2018
m行n列の行列Aにおいて、i(1≦i≦n)列に含まれる数値をすべてNaNに置換した行列Bを作成する方法を教えてください。 なお、Aのi列には数値またはNaNが格納されています。

  0 Comments

Sign in to comment.

Accepted Answer

Hiroumi Mita
Hiroumi Mita on 6 Aug 2018
セル配列を使うことで、文字列と数値の混在したデータを作ることができます。
%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]}

  0 Comments

Sign in to comment.

More Answers (6)

Hiroumi Mita
Hiroumi Mita on 2 Aug 2018
以下ではどうでしょうか?
%例
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

  0 Comments

Sign in to comment.


Hiroumi Mita
Hiroumi Mita on 2 Aug 2018
列番号で指定するほうが簡単だと思いますが
次のようなプログラムで、ラベル名を探し出してその列を一括書き換えするようなことは可能です。
%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

  0 Comments

Sign in to comment.


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

  0 Comments

Sign in to comment.


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

  0 Comments

Sign in to comment.


Hiroumi Mita
Hiroumi Mita on 2 Aug 2018
以下のように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

  0 Comments

Sign in to comment.


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

  0 Comments

Sign in to comment.

Sign in to answer this question.