How to create new rows in a table based on nested cell arrays of different sizes

19 visualizaciones (últimos 30 días)
So I have a table that contains nested cell arrays in only one column. What I'd like to accomplish is create a new table that has the contents of each cell made into new rows below the original row.
Ive attached a sample of what the data looks like(file), as well as what id like to accomplish(file2). I'd like to accomplish this for every embedded cell.

Respuesta aceptada

Stephen23
Stephen23 el 22 de Jun. de 2023
Editada: Stephen23 el 22 de Jun. de 2023
This is MATLAB, so do not use on concatenation within loops to achieve this task. Better:
S1 = load('file.mat');
S2 = load('file2.mat');
T1 = S1.non_compliance_B % provided input
T1 = 9×9 table
ID PayloadElectronicsUnitSubsystemSpecification LastModifiedOn ProposedVerifDescription ProposedText ObjectType ChildTraceabilityCount ChildTraceability RvCCompliance __________ ____________________________________________ ______________ ________________________ ____________ __________ ______________________ _________________ _____________________ "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {16×1 cell} "Marginal Compliance" "PEU-389" {0×0 cell} 27-Feb-2023 {0×0 char} {0×0 char} {'Req'} 9 { 9×1 cell} "Non-Compliance" "PEU-840" {0×0 cell} 27-Feb-2023 {0×0 char} {0×0 char} {'Req'} 33 {33×1 cell} "Marginal Compliance" "PEU-280" {0×0 cell} 28-Feb-2023 {0×0 char} {0×0 char} {'Req'} 8 { 8×1 cell} "Non-Compliance" "PEU-2595" {0×0 cell} 16-Apr-2023 {0×0 char} {0×0 char} {'Req'} 5 { 5×1 cell} "Non-Compliance" "PEU-2591" {0×0 cell} 16-Apr-2023 {0×0 char} {0×0 char} {'Req'} 5 { 5×1 cell} <missing> "PEU-730" {0×0 cell} 27-Feb-2023 {0×0 char} {0×0 char} {'Req'} 6 { 6×1 cell} "Non-Compliance" "PEU-2586" {0×0 cell} 16-Apr-2023 {0×0 char} {0×0 char} {'Req'} 5 { 5×1 cell} "Non-Compliance" "PEU-956" {0×0 cell} 27-Feb-2023 {0×0 char} {0×0 char} {'Req'} 6 { 6×1 cell} "Non-Compliance"
T2 = S2.bal % desired output
T2 = 24×9 table
ID PayloadElectronicsUnitSubsystemSpecification LastModifiedOn ProposedVerifDescription ProposedText ObjectType ChildTraceabilityCount ChildTraceability RvCCompliance __________ ____________________________________________ ______________ ________________________ ____________ __________ ______________________ _________________ _____________________ "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'PRS-738' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'PRS-762' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'PRS-910' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RF1-553' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RF1-560' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO-993' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO-1000'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO-1002'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO2-147'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO2-156'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO2-294'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2566' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2582' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2583' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2584' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2585' } "Marginal Compliance"
L = cellfun(@numel,T1.ChildTraceability);
T3 = repelem(T1,L,1);
T3.ChildTraceability = vertcat(T1.ChildTraceability{:})
T3 = 93×9 table
ID PayloadElectronicsUnitSubsystemSpecification LastModifiedOn ProposedVerifDescription ProposedText ObjectType ChildTraceabilityCount ChildTraceability RvCCompliance __________ ____________________________________________ ______________ ________________________ ____________ __________ ______________________ _________________ _____________________ "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'PRS-738' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'PRS-762' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'PRS-910' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RF1-553' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RF1-560' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO-993' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO-1000'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO-1002'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO2-147'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO2-156'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'RFIO2-294'} "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2566' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2582' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2583' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2584' } "Marginal Compliance" "PEU-2069" {0×0 cell} 05-May-2023 {0×0 char} {0×0 char} {'Req'} 16 {'2585' } "Marginal Compliance"
  2 comentarios
Peter Perkins
Peter Perkins el 17 de Jul. de 2023
Stephen23 is 100% correct, but in case anyone needs an explanation of this somewhat advanced trick:
1) each cell of ChildTraceability contains a column with multiple rows. Nothing wrong with that, it's how you "multiple rows in one row of a table".
2) To move those "inner" rows out to the table itself, we need to make copies of each of T1's rows so there is one row for each of the "inner rows". That's what the repelem does. But it also makes copies of each of the cells in ChildTraceability, and we want to "explode" them instead.
3) So turn ChildTraceability into a cell column with one char row in each cell by first applying {:} to get all the contents of all the cells, and then vertcat to put those into one column of cells. This takes some thought, because ChildTraceability is a cell array each of whose cells contains a cell array (or char row vectors). Strings (i.e. double quotes) would make this easier to think about!
4) I might go one step further and turn ChildTraceability into a categorical variable, but not if its values are all unique

Iniciar sesión para comentar.

Más respuestas (1)

Akira Agata
Akira Agata el 22 de Jun. de 2023
How about the following?
load("file.mat");
bal = table();
for kk = 1:height(non_compliance_B)
t = non_compliance_B(kk, :);
t = t(ones(t.ChildTraceabilityCount, 1), :);
t.ChildTraceability = t.ChildTraceability{1};
bal = [bal; t]; %#ok
end
  3 comentarios

Iniciar sesión para comentar.

Categorías

Más información sobre Logical en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by