Create dataset from multiple Cell arrays

16 ビュー (過去 30 日間)
Anne-Laure GUINET
Anne-Laure GUINET 2019 年 7 月 22 日
コメント済み: Anne-Laure GUINET 2019 年 7 月 24 日
Hi everybody,
I have a problem to better structure my data...
My results are located in a 47×1 cell array. In fact, each rows is one patient's results. Each patient have nine colums of results, also located in a cell arrays. So, I have 47 patients. For each of them, 9 cell arrays of results.
I would like to create an unique dataset that contains the 3, 4, 5th cell arrays of each patient. After I would like to export this dataset to csv file.
I'm sorry I can't share my code because it's patient's data, but I attach captures of the cell arrays.
Hope you can help me.
Thanks.
  3 件のコメント
Anne-Laure GUINET
Anne-Laure GUINET 2019 年 7 月 23 日
In fact I have solved the problem "manually" but it was very long ! If you have an idea to make that in a loop...
I would like to have :
R1 = {[Results{1,1}{1,3} Results{1,1}{1,4} Results{1,1}{1,5}]};
R2 = {[Results{2,1}{1,3} Results{2,1}{1,4} Results{2,1}{1,5}]};
R3 = {[Results{3,1}{1,3} Results{3,1}{1,4} Results{3,1}{1,5}]};
R4 = {[Results{4,1}{1,3} Results{4,1}{1,4} Results{4,1}{1,5}]};
...
R47
47 is a length of "List" which is a cell array with the name of the patients.
And :
AL_SL=cat(1,R1{1,1}(:,1),R2{1,1}(:,1),R3{1,1}(:,1),R4{1,1}(:,1),R5{1,1}(:,1),R6{1,1}(:,1),R7{1,1}(:,1),R8{1,1}(:,1),R9{1,1}(:,1),R10{1,1}(:,1),R11{1,1}(:,1),R12{1,1}(:,1),R13{1,1}(:,1),R14{1,1}(:,1),R15{1,1}(:,1),R16{1,1}(:,1),R17{1,1}(:,1),R18{1,1}(:,1),R19{1,1}(:,1),R20{1,1}(:,1),R21{1,1}(:,1),R22{1,1}(:,1),R23{1,1}(:,1),R24{1,1}(:,1),R25{1,1}(:,1),R26{1,1}(:,1),R27{1,1}(:,1),R28{1,1}(:,1),R29{1,1}(:,1),R30{1,1}(:,1),R31{1,1}(:,1),R32{1,1}(:,1),R33{1,1}(:,1),R34{1,1}(:,1));
AM1_SL=cat(1,R1{1,1}(:,2),R2{1,1}(:,2),R3{1,1}(:,2),R4{1,1}(:,2),R5{1,1}(:,2),R6{1,1}(:,2),R7{1,1}(:,2),R8{1,1}(:,2),R9{1,1}(:,2),R10{1,1}(:,2),R11{1,1}(:,2),R12{1,1}(:,2),R13{1,1}(:,2),R14{1,1}(:,2),R15{1,1}(:,2),R16{1,1}(:,2),R17{1,1}(:,2),R18{1,1}(:,2),R19{1,1}(:,2),R20{1,1}(:,2),R21{1,1}(:,2),R22{1,1}(:,2),R23{1,1}(:,2),R24{1,1}(:,2),R25{1,1}(:,2),R26{1,1}(:,2),R27{1,1}(:,2),R28{1,1}(:,2),R29{1,1}(:,2),R30{1,1}(:,2),R31{1,1}(:,2),R32{1,1}(:,2),R33{1,1}(:,2),R34{1,1}(:,2));
AM2_SL=cat(1,R1{1,1}(:,3),R2{1,1}(:,3),R3{1,1}(:,3),R4{1,1}(:,3),R5{1,1}(:,3),R6{1,1}(:,3),R7{1,1}(:,3),R8{1,1}(:,3),R9{1,1}(:,3),R10{1,1}(:,3),R11{1,1}(:,3),R12{1,1}(:,3),R13{1,1}(:,3),R14{1,1}(:,3),R15{1,1}(:,3),R16{1,1}(:,3),R17{1,1}(:,3),R18{1,1}(:,3),R19{1,1}(:,3),R20{1,1}(:,3),R21{1,1}(:,3),R22{1,1}(:,3),R23{1,1}(:,3),R24{1,1}(:,3),R25{1,1}(:,3),R26{1,1}(:,3),R27{1,1}(:,3),R28{1,1}(:,3),R29{1,1}(:,3),R30{1,1}(:,3),R31{1,1}(:,3),R32{1,1}(:,3),R33{1,1}(:,3),R34{1,1}(:,3));
Comp_SL=[AL_SL AM1_SL AM2_SL];
Guillaume
Guillaume 2019 年 7 月 23 日
" If you have an idea to make that in a loop..."
It's possible that a loop is not even needed and that it can be done easily and efficiently in just a few lines of code.
But to answer you, I need you to answer my questions. So, again:
Is each subcell (corresponding to a patient) always a vector of 13 elements or does the number of elements vary per patient?
Another way to answer that is to give us the output of:
pl = cellfun(@(c) numel(c{1}), Results);
min(pl)
max(pl)
Also, what do the 9 elements correspond to? The easiest way to export your data to csv would be to convert your data to a table, which will require names for the 9 columns, so what should they be named?
A table would also make it much easier for you to analyse the data than cell arrays of cell arrays.

サインインしてコメントする。

採用された回答

Guillaume
Guillaume 2019 年 7 月 23 日
編集済み: Guillaume 2019 年 7 月 23 日
For lack of answers to my questions, here is a more efficient method than the accepted answer:
allpatients = vertcat(Results{:}); %convert in a 47x9 cell array
desireddata = cell2mat(allpatients(:, [3, 4, 5]));
A better way (for further processing) would have been to convert to a table but answers neeeded....
  1 件のコメント
Anne-Laure GUINET
Anne-Laure GUINET 2019 年 7 月 24 日
It work perfectly !
Thank you very much for your help :)

サインインしてコメントする。

その他の回答 (1 件)

Shubham Gupta
Shubham Gupta 2019 年 7 月 23 日
I think you can simply achieve this by a for loop. Try this :
AL_SL = [];
AM1_SL = [];
AM2_SL = [];
for i = 1:47
AL_SL = [AL_SL;Results{i,1}{1,3}];
AM1_SL = [AM1_SL;Results{i,1}{1,4}];
AM2_SL = [AM2_SL;Results{i,1}{1,4}];
end
Comp_SL=[AL_SL AM1_SL AM2_SL];
I hope this helps !
  6 件のコメント
Anne-Laure GUINET
Anne-Laure GUINET 2019 年 7 月 24 日
編集済み: Anne-Laure GUINET 2019 年 7 月 24 日
Thanks Guillaume. It works also for 47 patients but I have to erase some data because of my algo doesn't work for them.
No, the number of rows is different for each patient.
Anne-Laure GUINET
Anne-Laure GUINET 2019 年 7 月 24 日
編集済み: Anne-Laure GUINET 2019 年 7 月 24 日
Exept for cell 2 which is always a scalar.
The cell 1 is a time vector.
The cell 2 is a percentage.
The cells 3, 4 , 5 correspond to step length given by different method of calcul.
The cells 6, 7, 8, 9 correspond to time for column 1 and step length for column 2, calculated with 4 different method.
So I have to create a name vector ?
Name=('time', 'percentage'...) % etc for the 9 cells

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrices and Arrays についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by