how to concatenate tables stored in a structure
43 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
DuckDuck
el 11 de Mayo de 2018
Respondida: Peter Perkins
el 3 de Mayo de 2019
I have a structure where tables with same variable names are stored. I want to concatenate all these tables in one big table.
say i have struct S
struct with fields:
T1: [34113×16 table]
T2: [34133×16 table]
T3: [34059×16 table]
T4: [33297×16 table]
T5: [34150×16 table]
I can do:
T=cat(1,T1,T2,T3,T4,T5)
but want to do it with listing struct fields and concatenate.
1 comentario
Respuesta aceptada
Guillaume
el 11 de Mayo de 2018
As Stephen commented, the initial designed is flawed. numbered variables and field names should always be replaced by a single container.
With a structure it's easily fixed by converting the structure into a cell array:
C = struct2cell(S);
vertcat(C{:}) %vertically concatenate all the fields of S
1 comentario
Jan
el 17 de Mayo de 2018
+1. If the data are represented as fields of a struct, this is the easiest solution. Stephen's comment showed, how to avoid a list of "numbered" fields by using a struct array. Alternatively you could store the tables in a cell array also: T{1}, T{2}, ... or if you need it: S.T{1}, S.T{2}, ... Then the concatenation is done again by:
vertcat(S.T{:}) % or vertcat(T{:})
Más respuestas (2)
Peter Perkins
el 3 de Mayo de 2019
If you really ever only have five fields/tables in your scalar struct, just do this:
T=cat(1,S.T1,S.T2,S.T3,S.T4,S.T5)
But presumably you already knew that and you have either a large number of fields/tables, or a variable number. Try this (which uses numeric scalars instead of tables, but it's exactly the same):
>> s = struct; s.A = 1; s.B = 2; s.C = 3
s =
struct with fields:
A: 1
B: 2
C: 3
>> c = struct2cell(s)
c =
3×1 cell array
{[1]}
{[2]}
{[3]}
>> vertcat(c{:})
ans =
1
2
3
0 comentarios
John BG
el 11 de Mayo de 2018
Editada: John BG
el 11 de Mayo de 2018
Hi effess
there's no need to use the command cat or vertcat.
just concatenate the tables directly, like in the following example
1.
generating example data
var1=[1 2 3];var2=[4 5 6]
T1=table(var1,var2)
T2=T1
T3=T1
S(1).T=T1
S(2).T=T2
S(3).T=T3
2.
Since you clearly mentioned that all tables have the same variables, just put them all together like this:
T1=[S(1).T;S(2).T;S(3).T]
=
3×2 table
var1 var2
___________ ___________
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
.
effess
if you find this answer useful would you please be so kind to consider marking my answer as Accepted Answer?
To any other reader, if you find this answer useful please consider clicking on the thumbs-up vote link
thanks in advance for time and attention
John BG
7 comentarios
Jan
el 19 de Mayo de 2018
Editada: Jan
el 19 de Mayo de 2018
Suggesting evalin('base') to create a struct array (in the base workspace!) is complete useless and a bad programming practice. Compare this with the 2 lines of code suggested by Guillaume, which are working inside a function also.
John, you insist on claiming that horzcat is not needed and do use it repeatedly in form of its abbreviation [;] . This is a slapstick comedy.
Jan
el 30 de Abr. de 2019
Editada: Jan
el 30 de Abr. de 2019
@Rene Ferdinands: I've read your (meanwhile deleted) opinion about my "condescending" replies. Take into account, that this discussion has a background you are not aware of. Many contributions have been removed by the admins due to rudeness, so if you can see only my parts of the dicsussion, does not necessarily mean, that I was the aggressive part.
I appreciate that you care about the polite and friendly tone in the forum.
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!