Split arrays in table into separate rows

조회 수: 21 (최근 30일)
RP
RP 2021년 10월 21일
댓글: RP 2021년 10월 26일
Hello everyone,
I have a table - see screenshot for clarification - where some columns consist of one array each, e.g. the columns R2s and MT. One column contains an array with coordinates x, y and z for each of the items in the following arrays, so 6 sets of coordinates in this case in the first row. The other columns contain strings or single numbers, e.g. 'number_of_voxels'.
What I would like to do is to split the arrays and put each item with its corresponding items from all other columns - including the coordinate column - into one row, e.g.
voxel_coord_x voxel_coord_y voxel_coord_z R2s MT number_of_voxels
11 18 30 0.0124 1.6732 6
12 18 32 0.0162 1.4217 6
This would mean that the array with coordinates doesn't only need to be split into separate rows, but also into three columns. Also, I would need the columns with single strings to get repeated for rows that were in the same array, e.g. 'number_of_voxels' in this example.
I know strsplit could be used to separate the items at the semicolon, but I cannot figure out how to move everything into separate rows/columns. Note that not all arrays have the same number of items.
Thank you in advance for any help or tips!

채택된 답변

Duncan Po
Duncan Po 2021년 10월 22일
I think you can do what you want in several steps.
% Convert your cell arrays in voxel_coord, R2s, and MT into arrays using cell2mat
t1 = varfun(@cell2mat, t, 'InputVariables', {'voxel_coord', 'R2s', 'MT'});
t1.Properties.VariableNames = {'voxel_coord', 'R2s', 'MT'}); % varfun modifies the names, change them back
% Split voxel_coord into multiple columns
t1 = splitvars(t1, 'voxel_coord', 'NewVariableNames', {'voxel_coord_x', 'voxel_coord_y', 'voxel_coord_z'});
% Finally expand number_of_voxels and scale
t1.number_of_voxels = repelem(t.number_of_voxels, 6);
t1.scale = repelem(t.scale, 6);
  댓글 수: 3
Duncan Po
Duncan Po 2021년 10월 26일
It looks like the number of times you want to copy is equal to number_of_voxels value. Does this work?
% Finally expand number_of_voxels and scale
t1.number_of_voxels = repelem(t.number_of_voxels, t.number_of_voxels);
t1.scale = repelem(t.scale, t.number_of_voxels);
RP
RP 2021년 10월 26일
That's exactly what I wanted, thank you so so much for your help!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by