在R中找到月份的平均值/平均值时出错

时间:2014-08-14 22:05:06

标签: r dataframe dplyr mean

我有这个数据框,我想要替换/形成每月平均值的新数据集。

    month    value
  Oct. 2012  52.7
  Nov. 2012  53.0
  Dec. 2012  54.1
  Jan. 2013  53.1
  Feb. 2013  53.6
  Mar. 2013  53.8
  Apr. 2013  54.1
  May. 2013  54.6
  Jun. 2013  54.8
  Jul. 2013  54.3
  Aug. 2013  54.5
  Sep. 2013  54.5
  Oct. 2013  54.0
  Nov. 2013  54.2
  Dec. 2013  54.8
  Oct. 2012  37.2
  Nov. 2012  37.4
  Dec. 2012  38.4
      .        .
      .        .

正如您所看到的,每年的每个月,例如Oct. 2012Nov. 2012等都有多个值。现在,为了获得数据框中每个月份的平均值/平均值,我执行了这个命令

data_mean <- data_frame %.% group_by(month) %.% summarize(value = mean(value))

它确实正确地找到每个月的平均值但在输出中它按字母顺序重新排序月份。因此,输出Oct. 2012出现在Apr. 2013之后,依此类推。我想计算平均月份,但不想按字母顺序重新排序。如何修改上面的命令还是有一些较短的方法。

4 个答案:

答案 0 :(得分:3)

month列更改为具有适当排序级别的因子:

data_frame %>% 
  mutate(month = factor(substr(month, 1, 3), month.abb)) %>%
  group_by(month) %>% 
  summarize(value = mean(value))

,并提供:

   month    value
1    Jan 53.10000
2    Feb 53.60000
3    Mar 53.80000
4    Apr 54.10000
5    May 54.60000
6    Jun 54.80000
7    Jul 54.30000
8    Aug 54.50000
9    Sep 54.50000
10   Oct 47.96667
11   Nov 48.20000
12   Dec 49.10000

<强>更新

该问题按月要求提供数据;但是,在评论中,这是根据年/月修改的要求。在这种情况下,使用zoo将其转换为yearmon然后转换为数字(因为看起来dplyr分组不支持yearmon)并且可选地在结束时返回到yearmon:

library(zoo)

data_frame %>% 
  mutate(month = as.numeric(as.yearmon(as.character(month), "%b. %Y"))) %>%
  group_by(month) %>% 
  summarize(value = mean(value)) %>%
  mutate(month = as.yearmon(month))

答案 1 :(得分:1)

如果您的数据位于data.table

,这是一步
library(data.table)               # load library
DT <- as.data.table(DF)           # convert data.frame to data.table
DT[,mean(value),by=month]         # compute mean by month

这实际上是以unique类型排序的工作!

如果你想明确,还有两个步骤:

DT[,`:=`(mon = factor(substr(month, 1, 3), month.abb), 
         yr = substr(month,6,9))] # create new columns for month and year
setkey(DT,yr,mon)                 # set keys, order is important
DT[,mean(value),by=key(DT)]       # compute mean by key

这将为您提供所需的功能,并且可以更好地扩展大型阵列。 (与data.frame相比,快约10-50倍。)

请注意,data.table具有类data.frame,但此操作和类似操作的速度要快得多。

答案 2 :(得分:1)

如果您要做很​​多事情,可以考虑使用zoo包将其视为时间序列。

library(zoo)
df$yrmon <- as.yearmon(df$month,"%b. %Y")
aggregate(value~yrmon,df,mean)
##       yrmon value
## 1  Oct 2012 44.95
## 2  Nov 2012 45.20
## 3  Dec 2012 46.25
## 4  Jan 2013 53.10
## 5  Feb 2013 53.60
## 6  Mar 2013 53.80
## 7  Apr 2013 54.10
## 8  May 2013 54.60
## 9  Jun 2013 54.80
## 10 Jul 2013 54.30
## 11 Aug 2013 54.50
## 12 Sep 2013 54.50
## 13 Oct 2013 54.00
## 14 Nov 2013 54.20
## 15 Dec 2013 54.80

答案 3 :(得分:0)

您也可以使用tapply:

with(ddf, tapply(value, month, mean))
    Apr.     Aug.     Dec.     Feb.     Jan.     Jul.     Jun.     Mar.     May.     Nov.     Oct.     Sep. 
54.10000 54.50000 49.10000 53.60000 53.10000 54.30000 54.80000 53.80000 54.60000 48.20000 47.96667 54.50000