How to choose some rows of a table by order?

2 次查看(过去 30 天)
Hi,
I have a table with many rows but only 3 columns: dates, items, costs. For each date, there are many items and costs. I can use sortrows to sort the table by dates and costs; then I need to pick the top 3 costs from each day. I can loop through each day to get the top 3 costs. Is there a better simple way to do that?
Thanks a lot!

采纳的回答

Peter Perkins
Peter Perkins 2016-12-11
It sounds like a grouped varfun is what you're looking for:
>> item = randi([1 3],10,1);
>> date = datetime(2016,12,randi([1 3],10,1));
>> cost = round(10*rand(10,1),2);
>> t = table(item,date,cost)
t =
item date cost
____ ___________ ____
3 03-Dec-2016 3.52
1 01-Dec-2016 8.31
2 03-Dec-2016 5.85
3 01-Dec-2016 5.5
3 03-Dec-2016 9.17
3 02-Dec-2016 2.86
2 01-Dec-2016 7.57
1 01-Dec-2016 7.54
1 02-Dec-2016 3.8
1 02-Dec-2016 5.68
>> varfun(@topThree,t,'GroupingVariable','date','InputVariable','cost')
ans =
date GroupCount topThree_cost
___________ __________ _____________
01-Dec-2016 4 8.31
01-Dec-2016 4 5.5
01-Dec-2016 4 7.57
02-Dec-2016 3 2.86
02-Dec-2016 3 3.8
02-Dec-2016 3 5.68
03-Dec-2016 3 3.52
03-Dec-2016 3 5.85
03-Dec-2016 3 9.17
where topThree looks like this:
function y = topThree(x)
xs = sort(x,'descend');
y = x(1:min(3,end));
Hope this helps.
  2 个评论
dpb
dpb 2016-12-11
That's a nice functionality and great example, Peter... :)

请先登录,再进行评论。

更多回答(1 个)

David Barry
David Barry 2016-12-6
You could use the findgroups and splitapply pattern. Findgroups to get the date groups and then splitapply to find the first 3 costs in each group. Take a look at the doc links above for worked examples of this kind of pattern.

类别

Help CenterFile Exchange 中查找有关 Data Type Identification 的更多信息

标签

产品

Community Treasure Hunt

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

Start Hunting!

Translated by