排序后如何选择每个子组的最大值

时间:2014-04-02 20:29:56

标签: r sorting max

例如,我的数据如下:

month city  sale    company   
1   a   23  sony   
1   a   12  lenovo   
1   b   45  AAA   
1   b   34  BBB   
1   c   67  CCC   
1   c   35  sony   
1   d   65  DDD   
2   a   87  sony   
2   a   65  lenovo   
2   b   67  AAA   
2   b   45  BBB   
2   c   87  CCC   
2   c   54  sony   
2   d   43  DDD   

我按

排序数据
library(doBy)
sort <- orderBy(~month+city+sale,data=data) 

结果应该与上面的数据一样。

然后我想每个月提取每个城市中销售额最大的行,也就是说,我应该将1,3,5,7,8,10,11,13行提取到新的矩阵并导出它作为一个excel文件。

我怎么能这样做?实际数据更复杂,有数千条线。

1 个答案:

答案 0 :(得分:0)

您可以使用split-apply-combine按公司/月份对进行拆分,找到所需的行,然后将结果合并在一起。

以下是你在基地R中的表现:

do.call(rbind, lapply(split(dat, paste(dat$month, dat$city)),
                      function(x) x[which.max(x$sale),]))
#     month city sale company
# 1 a     1    a   23    sony
# 1 b     1    b   45     AAA
# 1 c     1    c   67     CCC
# 1 d     1    d   65     DDD
# 2 a     2    a   87    sony
# 2 b     2    b   67     AAA
# 2 c     2    c   87     CCC
# 2 d     2    d   43     DDD

split的调用按月/城市对分解数据框,lapply提取具有最大销售额的行,do.call使用rbind将所有内容全部分开一起进入最终的数据框架。