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
1 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Guillaume
2016-10-12
编辑:Guillaume
2016-10-12
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 个评论
Guillaume
2016-10-13
"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.
更多回答(1 个)
Massimo Zanetti
2016-10-12
编辑:Massimo Zanetti
2016-10-12
Get the "subject" column in one array containing data of all people, as follows:
allsubjects = data(:).subject
3 个评论
Guillaume
2016-10-12
编辑:Guillaume
2016-10-12
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.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Preprocessing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!