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

조회 수: 44 (최근 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 CenterFile Exchange에서 cell 配列에 대해 자세히 알아보기

태그

제품


릴리스

R2022a

Community Treasure Hunt

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

Start Hunting!