How to choose some rows of a table by order?
조회 수: 1 (최근 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
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
추가 답변 (1개)
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 Center 및 File Exchange에서 Time Series Objects에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!