Split arrays in table into separate rows
조회 수: 21 (최근 30일)
이전 댓글 표시
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!
댓글 수: 0
채택된 답변
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
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);
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Logical에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!