朋友要给以月为单位的时间序列数据分组然后按其中一个feature再进行排序。链家的一个面试题也要求对一个地区的数据进行分组然后排序。于是研究了一下怎么弄。
数据使用R内建的数据集 ChickWeight
> data=ChickWeight
> head(data)
weight Time Chick Diet
1 42 0 1 1
2 51 2 1 1
3 59 4 1 1
4 64 6 1 1
5 76 8 1 1
6 93 10 1 1
>summary(data)
weight Time Chick Diet
Min. : 35.0 Min. : 0.00 13 : 12 1:220
1st Qu.: 63.0 1st Qu.: 4.00 9 : 12 2:120
Median :103.0 Median :10.00 20 : 12 3:120
Mean :121.8 Mean :10.72 10 : 12 4:118
3rd Qu.:163.8 3rd Qu.:16.00 17 : 12
Max. :373.0 Max. :21.00 19 : 12
(Other):506
方法一,排序完再分组
#直接使用order命令传入第一分组参数,和第二分组参数。会直接返回以第一参数分组后再以第二参数分组的数据
>sdata=data[order(data$Diet,data$weight),]
#直接使用排序后的数据进行分组,因为weight是第二排序依据,所以分组后的数据也已经完成了分组
>result=split(data,data$Diet)
或者可以使用doBy包的orderBy进行操作,效果一样。本身orderBy方法就warp了order方法
>library(“doBy”)
>result=orderBy(~Diet+weight, data)
>result2=split(data,data$Diet)
方法二,分组后排序
#直接进行分组,分组后的weight数据列没有经过排序,生成了一个weight为无序状态的含有4个dataframe的list
>sdata=split(data,data$Diet)
#使用lapply对list里的每个元素(依照diet分组过后的数据)进行order操作,生成排序过的元素,注意order后面那个都好不要丢
>result=lapply(sdata,function(x) x[order(x[,1]),])