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

44 visualizaciones (últimos 30 días)
Shingo HAMADA
Shingo HAMADA el 27 de Sept. de 2022
Editada: Akira Agata el 28 de Sept. de 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]に一致するセルのそれぞれの位置を調べる
②'りんご'に一致するセルの数を数える
③'年'を含む文字列があるセルの数を数える
にはどうすればよいでしょうか?(無論、人力でのカウント以外でお願いします)
初歩的な質問で申し訳ございませんが、よろしくお願いいたします。

Respuesta aceptada

Hernia Baby
Hernia Baby el 27 de Sept. de 2022
Editada: Hernia Baby el 27 de Sept. de 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 comentarios
Akira Agata
Akira Agata el 27 de Sept. de 2022
Editada: Akira Agata el 28 de Sept. de 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 el 28 de Sept. de 2022
ご回答いただきましてありがとうございました!
ご回答を元に本来の対象に合わせてアレンジし、意図した結果を得ることができました。

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre cell 配列 en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!