MATLAB Answers

tableにフィルタ​ーをかけて特定の行だ​けを抽出したい(Fo​rを使わずに)

조회 수: 22(최근 30일)
やりたいこと
9853 x 4の以下のtableがあります。
test =
ID value_a value_b value_c
1 8 9 4
2 5 7 2
3 7 9 3
4 8 1 2
5 3 9 6
. . . .
. . . .
9853 5 6 8
このtableから特定のIDを持つ行だけを抽出したいです。
たとえば、ID=1, 3の行を抽出する場合は、
ID value_a value_b value_c
1 8 9 4
3 7 9 3
としたいのです。
IDが2つであれば問題ありませんが、
多数のID、例えば
ID = 1, 5, 8, 9, 13, ...... 753, 986, ......1587, 1689, ...... 9850
といった数千以上のIDを持つ行だけを抽出したいです。
For文を使わずにスマートに抽出する方法はないでしょうか?
ご教示ください。
私の説明に不明な点があれば聞いてください。
よろしくお願いします。

  댓글 수: 0

댓글을 달려면 로그인하십시오.

채택된 답변

Kojiro Saito
Kojiro Saito 30 Sep 2020
以下のようなやり方で抽出できます。
ここではidsに抽出したいIDを抜粋して[]で括っていますが、実際の数千のIDを直書きするか、ファイルから読み取るなどしてみてください。
ids = [1, 5, 8, 9, 13, 9850];
index = test.ID == ids; % indexに9853×(idsの要素数)の0 or 1が格納されます。
row = find(sum(index, 2)); % sumで行ごとにマージして9853×1の0 or 1の行列にし、findで非0(1の値)を持つ行数を抽出
extractedData = test(row, :); % IDがidsと一致する行のデータのみ抽出

  댓글 수: 3

Yusaku Ohta
Yusaku Ohta 30 Sep 2020
迅速かつスマートなご回答、大変ありがとうございます。
説明もわかりやすかったです。
Akira Agata
Akira Agata 30 Sep 2020
別のやり方として、ismember 関数を使う方法もあります。
ids = [1, 5, 8, 9, 13, 9850]; % 抽出したいID
idx = ismember(test.ID, ids); % idxに9853×1の0 or 1が格納されます(test.IDがidsの要素なら1)。
extractedData = test(idx,:); % IDがidsのいずれかと一致する行のデータのみ抽出
Yusaku Ohta
Yusaku Ohta 1 Oct 2020
ismemberを使えばよりスマートにできるんですね。
大変参考になりました。
ありがとうございます。

댓글을 달려면 로그인하십시오.

추가 답변(0개)

Community Treasure Hunt

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

Start Hunting!