I guess people are misunderstanding me - I want to sort column 2 and 3 (time and perimeter) by a third column "subject" where each row has person1, person1, person1, person1 . . . . person 2, person 2, person 2 . . . etc etc - - sorry to be confusing!!
sort X and Y columns according to a repeated string in a 3rd column and scatter plot
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
cgenes
am 12 Okt. 2016
Kommentiert: Guillaume
am 13 Okt. 2016
Hi, I have 3 columns (in a struct array called "data") columns are; "subject", "timepoint", "perimeter" . How can can I use something like gscatter to group the "person" column (there are 8 people) - I can get it to work for one person but am having trouble making it work for all 8 people . Thanks
x =[]; y = [];
for i = 1:length(data)
if strcmp(data(i).subject,'Person1')
x(i) = data(i).timepoint;
y(i) = length(data(i).perimeter);
end
end
scatter(x, y);
4 Kommentare
Akzeptierte Antwort
Guillaume
am 12 Okt. 2016
Bearbeitet: Guillaume
am 12 Okt. 2016
gscatter([data.timepoint], [data.perimeter], {data.subject})
But, I would recommend you convert you struct array into a table which is easier to work with:
tdata = struct2table(data);
gscatter(tdata.timepoint, tdata.perimeter, tdata.subject)
edit: So it seems you just want to sort the data and actually don't care about a scatter plot. Again, this is much easier if you convert to a table:
tdata = struct2table(data);
tdata = sortrows(data, 'subject');
With a structure:
[~, order] = sort({data.subject});
sorteddata = data(order);
6 Kommentare
Guillaume
am 13 Okt. 2016
"For N groups, every integer between 1 and N must occur at least once in the vector of group numbers"
That's a limitation imposed by splitapply that I wasn't aware of. So, yes my method is not going to work.
Splitting the table in two
isyoung = contains(tdata.subject, 'Y');
tyoung = tdata(isyoung, :);
told = tdata(~isyoung, :);
and doing findgroup and splitapply on each is probably the simplest indeed.
Weitere Antworten (1)
Massimo Zanetti
am 12 Okt. 2016
Bearbeitet: Massimo Zanetti
am 12 Okt. 2016
Get the "subject" column in one array containing data of all people, as follows:
allsubjects = data(:).subject
3 Kommentare
Guillaume
am 12 Okt. 2016
Bearbeitet: Guillaume
am 12 Okt. 2016
data(:).subject (or simply data.subject) returns a comma separated list. With the answer given, only the first element of the list is assigned (to allsubjects), so the effect of the above is actually:
allsubjects = data(1).subject;
The correct syntax should have been:
allsubjects = {data.subject};
to convert the list into a cell array of strings. This is what I have done in the third argument to gscatter in my answer (and what Massimo is trying to say, I assume).
To avoid dealing with comma-separated lists, conversion to cell arrays or vectors (depending on type), etc. convert your structure into a table as I've also shown.
Siehe auch
Kategorien
Mehr zu Numeric Types finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!