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

46 ビュー (過去 30 日間)
Shingo HAMADA
Shingo HAMADA 2022 年 9 月 27 日
編集済み: Akira Agata 2022 年 9 月 28 日
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]に一致するセルのそれぞれの位置を調べる
②'りんご'に一致するセルの数を数える
③'年'を含む文字列があるセルの数を数える
にはどうすればよいでしょうか?(無論、人力でのカウント以外でお願いします)
初歩的な質問で申し訳ございませんが、よろしくお願いいたします。

採用された回答

Hernia Baby
Hernia Baby 2022 年 9 月 27 日
編集済み: Hernia Baby 2022 年 9 月 27 日
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 件のコメント
Akira Agata
Akira Agata 2022 年 9 月 27 日
編集済み: Akira Agata 2022 年 9 月 28 日
+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 2022 年 9 月 28 日
ご回答いただきましてありがとうございました!
ご回答を元に本来の対象に合わせてアレンジし、意図した結果を得ることができました。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange文字と文字列 についてさらに検索

タグ

製品


リリース

R2022a

Community Treasure Hunt

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

Start Hunting!