複数のデータ型を含むセル配列の配列要素を検索する

44 views (last 30 days)
Shingo HAMADA
Shingo HAMADA on 27 Sep 2022
Edited: Akira Agata on 28 Sep 2022
char型、numeric型、missingなど複数のデータ型を含むセル配列について、セル配列の要素の位置や数を取得したいです。
文字ベクトルのセル配列については検索方法があると分かったのですが、複数のデータ型を含むセル配列の要素を検索する方法が見つからなかったため質問させていただきます。
たとえば、以下のようなセル配列について(内容は質問用に作ったサンプルです)、
testcell = {missing,'売上(千個)','種類','りんご','りんご','みかん','ぶどう';...
missing,missing,'品種','ふじ','紅玉','せとか','巨峰';...
missing,'2018年',missing,23,13,13,8;...
missing,'2019年',missing,25,25,18,16;...
missing,'2020年',missing,25,13,20,24;...
missing,'2021年',missing,23,missing,25,25}
①[25]に一致するセルのそれぞれの位置を調べる
②'りんご'に一致するセルの数を数える
③'年'を含む文字列があるセルの数を数える
にはどうすればよいでしょうか?(無論、人力でのカウント以外でお願いします)
初歩的な質問で申し訳ございませんが、よろしくお願いいたします。

Accepted Answer

Hernia Baby
Hernia Baby on 27 Sep 2022
Edited: Hernia Baby on 27 Sep 2022
cellの要素毎の計算はcellfunを用います。
まずはデータを用意します
testcell = {missing,'売上(千個)','種類','りんご','りんご','みかん','ぶどう';...
missing,missing,'品種','ふじ','紅玉','せとか','巨峰';...
missing,'2018年',missing,23,13,13,8;...
missing,'2019年',missing,25,25,18,16;...
missing,'2020年',missing,25,13,20,24;...
missing,'2021年',missing,23,missing,25,25}
testcell = 6×7 cell array
{1×1 missing} {'売上(千個)'} {'種類' } {'りんご'} {'りんご' } {'みかん'} {'ぶどう'} {1×1 missing} {1×1 missing} {'品種' } {'ふじ' } {'紅玉' } {'せとか'} {'巨峰' } {1×1 missing} {'2018年' } {1×1 missing} {[ 23]} {[ 13]} {[ 13]} {[ 8]} {1×1 missing} {'2019年' } {1×1 missing} {[ 25]} {[ 25]} {[ 18]} {[ 16]} {1×1 missing} {'2020年' } {1×1 missing} {[ 25]} {[ 13]} {[ 20]} {[ 24]} {1×1 missing} {'2021年' } {1×1 missing} {[ 23]} {1×1 missing} {[ 25]} {[ 25]}
①[25]に一致するセルのそれぞれの位置を調べる
今回は25を数字としたまま判別します。
ischarで文字を0に変更、そしてismissingで空欄を0に変更します。
※追記:これも②の方法使えばうまくいきますね
A = testcell;
% A(cellfun(@ischar,A)) = {0};
% A(cellfun(@ismissing,A)) = {0};
A(cellfun(@(x) ~isnumeric(x) ,A)) = {0};
cell2matで数字に直し、findで行と列の番号を求めます。
[r,c] = find(cell2mat(A)==25);
Arrange1 = [r,c]
Arrange1 = 5×2
4 4 5 4 4 5 6 6 6 7
②'りんご'に一致するセルの数を数える
ischarの否定を'(何もない文字)'に変換します。
B = testcell;
B(cellfun(@(x) ~ischar(x) ,B)) = {''};
strcmpで【りんご】と一致するものを1とし、足し合わせます。
S2 = sum(cellfun(@(x) strcmp(x,'りんご'),B),"all")
S2 = 2
③'年'を含む文字列があるセルの数を数える
containsで【年】を含むものを1とし、足し合わせます。
S3 = sum(cellfun(@(x) contains(x,'年'),B),"all")
S3 = 4
  2 Comments
Akira Agata
Akira Agata on 27 Sep 2022
Edited: Akira Agata on 28 Sep 2022
+1
cellfunisequal を組み合わせて、以下のような方法で確認することもできます。
% まずはデータを用意
testcell = {missing,'売上(千個)','種類','りんご','りんご','みかん','ぶどう';...
missing,missing,'品種','ふじ','紅玉','せとか','巨峰';...
missing,'2018年',missing,23,13,13,8;...
missing,'2019年',missing,25,25,18,16;...
missing,'2020年',missing,25,13,20,24;...
missing,'2021年',missing,23,missing,25,25};
% 1) 25に一致するセルの位置と数を調べる
idx_25 = cellfun(@(x) isequal(x, 25), testcell)
idx_25 = 6×7 logical array
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1
nnz(idx_25)
ans = 5
% 2) 'りんご'に一致するセルの位置と数を調べる
idx_apple = cellfun(@(x) isequal(x, 'りんご'), testcell)
idx_apple = 6×7 logical array
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
nnz(idx_apple)
ans = 2
Shingo HAMADA
Shingo HAMADA on 28 Sep 2022
ご回答いただきましてありがとうございました!
ご回答を元に本来の対象に合わせてアレンジし、意図した結果を得ることができました。

Sign in to comment.

More Answers (0)

Categories

Find more on cell 配列 in Help Center and File Exchange

Tags

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!