table with NaNs into separate cells
現在この質問をフォロー中です
- フォローしているコンテンツ フィードに更新が表示されます。
- コミュニケーション基本設定に応じて電子メールを受け取ることができます。
エラーが発生しました
ページに変更が加えられたため、アクションを完了できません。ページを再度読み込み、更新された状態を確認してください。
古いコメントを表示
I have a table (M) with 4 columns (columns named X, Y, Z,K) , there is a break between the data that loads as NaN.
I want place each data chunk into cells with all 4 columns (X, Y, Z,K).

Thank you!
採用された回答
Voss
2024 年 4 月 24 日
% making a table with some all-NaN rows:
Var = randi(100,12,4);
Var([3 9],:) = NaN;
M = array2table(Var)
M = 12x4 table
Var1 Var2 Var3 Var4
____ ____ ____ ____
7 12 6 2
80 39 44 44
NaN NaN NaN NaN
48 78 45 83
3 97 37 62
35 55 21 4
37 44 22 79
85 95 92 85
NaN NaN NaN NaN
98 21 58 64
13 57 8 58
96 89 36 89
% split the table on the all-NaN rows into a cell array of tables:
idx = find(all(isnan(M{:,:}),2));
s_idx = [1; idx+1];
e_idx = [idx-1; size(M,1)];
result = arrayfun(@(s,e)M(s:e,:),s_idx,e_idx,'UniformOutput',false)
result = 3x1 cell array
{2x4 table}
{5x4 table}
{3x4 table}
celldisp(result)
result{1} =
Var1 Var2 Var3 Var4
____ ____ ____ ____
7 12 6 2
80 39 44 44
result{2} =
Var1 Var2 Var3 Var4
____ ____ ____ ____
48 78 45 83
3 97 37 62
35 55 21 4
37 44 22 79
85 95 92 85
result{3} =
Var1 Var2 Var3 Var4
____ ____ ____ ____
98 21 58 64
13 57 8 58
96 89 36 89
10 件のコメント
puccapearl
2024 年 4 月 24 日
Thank you Voss, I now have a cell with tables. How can I pull each table that contains a specific column value. For example in the picture above, I want to pull all the tables where the 3rd column == 1 into a separate cell.
I tried but the tables combine as a double which I don't want, I want to keep the separate tables.
Can also repost as a different question.
Voss
2024 年 4 月 24 日
You're welcome!
One way to have all the tables in separate cells, but only the rows where column 3 is 1, is to split them first, as in my answer, and then:
result = cellfun(@(t)t(t{:,3} == 1,:),result,'UniformOutput',false);
puccapearl
2024 年 4 月 24 日
amazing, thank you!
Voss
2024 年 4 月 25 日
You're welcome!
puccapearl
2024 年 4 月 25 日
Voss, one more thing, I want to subtract the first and last values of each table in column 1,
I tried this,
F = @(x)x(end)-x(1);
b = cellfun(F, result , 'un',0);
but I need to index into the first column of each table and I'm not sure how to do this.
Voss
2024 年 4 月 25 日
F = @(x)x{end,1}-x{1,1};
b = cellfun(F, result);
puccapearl
2024 年 4 月 25 日
編集済み: puccapearl
2024 年 4 月 25 日
ah yes I thought so! My issue is, when I do this:
result = cellfun(@(t)t(t{:,3} == 1,:),result,'UniformOutput',false);
I get a cell with some empty tables,

and that gives me an indexing error error when I try to do:
F = @(x)x{end,1}-x{1,1};
b = cellfun(F, result);
Do you know how I can remove the empty tables prior to avoid the error? I tried:
result = table2cell(rmmissing(cell2table(result)))
and
result(cellfun(@isempty,result))=[];
and
result(:,all(ismissing(result)))=[];
and
new_result = rmmissing(result);
but they do not remove the empty tables :/
Voss
2024 年 4 月 25 日
This is how to do it. Try it again.
result(cellfun(@isempty,result)) = [];
puccapearl
2024 年 4 月 25 日
It works! Thank you Voss! :D
Voss
2024 年 4 月 25 日
You're welcome!
その他の回答 (0 件)
カテゴリ
ヘルプ センター および File Exchange で Tables についてさらに検索
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
