how to concatenate tables stored in a structure
42 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Guillaume
2018-5-11
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 个评论
Jan
2018-5-17
+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{:})
更多回答(2 个)
Peter Perkins
2019-5-3
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 个评论
John BG
2018-5-11
编辑:John BG
2018-5-11
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 个评论
Jan
2018-5-19
编辑:Jan
2018-5-19
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
2019-4-30
编辑:Jan
2019-4-30
@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.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!