我有这个数据框,我想要替换/形成每月平均值的新数据集。
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. 2012
,Nov. 2012
等都有多个值。现在,为了获得数据框中每个月份的平均值/平均值,我执行了这个命令
data_mean <- data_frame %.% group_by(month) %.% summarize(value = mean(value))
它确实正确地找到每个月的平均值但在输出中它按字母顺序重新排序月份。因此,输出Oct. 2012
出现在Apr. 2013
之后,依此类推。我想计算平均月份,但不想按字母顺序重新排序。如何修改上面的命令还是有一些较短的方法。
答案 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