how to concatenate tables stored in a structure
43 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
DuckDuck
le 11 Mai 2018
Réponse apportée : Peter Perkins
le 3 Mai 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 commentaire
Réponse acceptée
Guillaume
le 11 Mai 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 commentaire
Jan
le 17 Mai 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{:})
Plus de réponses (2)
Peter Perkins
le 3 Mai 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 commentaires
John BG
le 11 Mai 2018
Modifié(e) : John BG
le 11 Mai 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 commentaires
Jan
le 19 Mai 2018
Modifié(e) : Jan
le 19 Mai 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
le 30 Avr 2019
Modifié(e) : Jan
le 30 Avr 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.
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!