按月订购数据

时间:2014-01-23 18:23:27

标签: r sorting

我已经计算了此data.frame中每月的最大数量:

counts <- data.frame(year = sort(rep(2000:2009, 12)), month = rep(month.abb,10), count = sample(1:500, 120, replace = T))

library(plyr)
count_max <- ddply(counts, .(month), summarise, max.count = max(count))


  month max.count
1    Apr       470
2    Aug       389
3    Dec       446
4    Feb       487
5    Jan       473
6    Jul       460
7    Jun       488
8    Mar       449
9    May       488
10   Nov       464
11   Oct       483
12   Sep       394

我现在想要按count_max向量对month.abb进行排序,以便month按照通常的顺序在Jan-Dec中进行。这就是我试过的:

count_max[match(count_max$month, month.abb),]

......但它不起作用。如何在1月至12月的订单中安排count_max$month

2 个答案:

答案 0 :(得分:3)

没有转化的替代方案:

count_max[order(match(count_max$month, month.abb)), ]
#    month max.count
# 5    Jan       466
# 4    Feb       356
# 8    Mar       496
# 1    Apr       489
# 9    May       498
# 7    Jun       497
# 6    Jul       491
# 2    Aug       446
# 12   Sep       414
# 11   Oct       490
# 10   Nov       416
# 3    Dec       475         

请注意,在您的示例中,match(count...)会在month.abb中返回给定月份的位置,这是您要排序的内容。你真的很接近,但不是按照那个向量进行排序,而是用它进行子集化。因此,例如,8月是原始DF中的第2个值,但是month.abb中的第8个值,因此子集向量中第2个值的匹配值为8,这意味着您将放置第8个值您的原始数据框的行(在您的情况下为March),进入新DF的第二个位置,而不是将原始DF中的第二行排列到新DF的第8位。

这种区别有点像是一种大脑扭曲,但如果你认为它应该是有道理的。

答案 1 :(得分:1)

将“月”列转换为有序的factor

factor(count_max$month, month.abb, ordered=TRUE)
# [1] Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sep
# Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < Oct < Nov < Dec

示例:

count_max$month <- factor(count_max$month, month.abb, ordered=TRUE)
count_max[order(count_max$month), ]
#    month max.count
# 5    Jan       482
# 4    Feb       408
# 8    Mar       483
# 1    Apr       489
# 9    May       369
# 7    Jun       432
# 6    Jul       344
# 2    Aug       470
# 12   Sep       474
# 11   Oct       450
# 10   Nov       492
# 3    Dec       366