How do you split a table into sub-tables based on entries in a specific column?

308 views (last 30 days)
How do you split a table into sub-tables based on entries in a specific column? Essentially, I want to divide my table data into groups, determined by one of its values.

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 13 Oct 2022
Edited: MathWorks Support Team on 13 Oct 2022
I have created a simple example which demonstrates how to split a table based on the first column as the category variable.
The script is also attached as "test_script.m". Please read the comments to get a better understanding of how to use the script for your use case.
% Patient pateint data
load patients
% Create test table
T = table(Gender(1:5), Height(1:5), 'VariableNames', {'Gender', 'Height'});
% Group based on first column - gender column
% Modify 1 to appropriate column number
G = findgroups(T{:, 1});
% Split table based on first column - gender column
T_split = splitapply( @(varargin) varargin, T , G);
% Allocate empty cell array fo sizxe equal to number of rows in T_Split
subTables = cell(size(T_split, 1));
% Create sub tables
for i = 1:size(T_split, 1)
subTables{i} = table(T_split{i, :}, 'VariableNames', ...
% Display Results
disp('Full Table:');
disp('Sub Table 1:');
disp('Sub Table 2:');
See this documentation for another example of using 'splitapply':
Here is a list of the functions I am using:

More Answers (1)

yogan Sganzerla
yogan Sganzerla on 13 Jul 2021
Edited: yogan Sganzerla on 13 Jul 2021
It didn't helped me, so I will try to write down one example:
I have the following table:
[ 14-Jul-2021 20:36:59 1
14-Jul-2021 20:37:59 1
14-Jul-2021 20:38:59 1
14-Jul-2021 20:38:59 2
14-Jul-2021 20:40:59 2
14-Jul-2021 20:41:59 2
14-Jul-2021 20:42:59 2
14-Jul-2021 20:43:59 2
14-Jul-2021 20:44:59 1
14-Jul-2021 20:45:59 1
14-Jul-2021 20:46:59 2]
baisc, the values in the first column is datatime increasing 1 minut per line and the second colum can be just 1 or 2.
My goal is to breake this table into 2 table:
Table1= [ 14-Jul-2021 20:36:59 14-Jul-2021 20:38:59 1
14-Jul-2021 20:44:59 14-Jul-2021 20:46:59 1]
Table1= [ 14-Jul-2021 20:38:59 14-Jul-2021 20:44:59 2
14-Jul-2021 20:46:59 14-Jul-2021 20:47:59 2]
The first group of "1" start at 14-Jul-2021 20:36:59 and just finishe when the "2" starts so 14-Jul-2021 20:38:59
The same with the group 2 that starts at 14-Jul-2021 20:38:59 and finishes when the other group "1" starts (14-Jul-2021 20:44:59 )
and so on, until the lsat one, that we just add 1 minut because this is the duration on the signal
  1 Comment
Eric on 2 Feb 2023 at 14:16
Edited: Eric on 2 Feb 2023 at 15:45
This is exactly what I'm trying to do. Did you find a solution?
I figured it out:
cutoff = datetime("2022-08-7","InputFormat","uuuu-MM-dd")
idx = jobs.Started < cutoff; % Started is a variable in the table, jobs, which is datetime format
jobs_pre = jobs(idx,:);
jobs_post = jobs(~idx,:);

Sign in to comment.


Find more on Tables in Help Center and File Exchange




Community Treasure Hunt

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

Start Hunting!