在动物园的yearmon上使用dplyr汇总函数

时间:2015-05-31 04:10:53

标签: r dplyr zoo

我有一个数据框,其值与年和月相关联。我使用yearmon包中的zoo类来存储年月信息。

我的目标是计算同一年 - 月的平均值。但是,使用dplyr似乎会给我一个错误。

以下变量tst用于复制

> str(tst)
'data.frame':   20 obs. of  2 variables:
 $ n : int  23 24 26 27 26 23 19 19 22 22 ...
 $ ym:Class 'yearmon'  num [1:20] 2004 2004 2004 2004 2004 ...
> dput(tst)
structure(list(n = c(23L, 24L, 26L, 27L, 26L, 23L, 19L, 19L, 
22L, 22L, 22L, 22L, 26L, 26L, 19L, 22L, 26L, 25L, 22L, 18L), 
    ym = structure(c(2004, 2004, 2004, 2004, 2004.08333333333, 
    2004.08333333333, 2004.08333333333, 2004.08333333333, 2004.08333333333, 
    2004.16666666667, 2004.16666666667, 2004.16666666667, 2004.16666666667, 
    2004.25, 2004.25, 2004.25, 2004.25, 2004.33333333333, 2004.33333333333, 
    2004.33333333333), class = "yearmon")), .Names = c("n", "ym"
), row.names = c(NA, 20L), class = "data.frame")

错误是

> tst %>% group_by(ym) %>% summarize(ave=mean(n))
Error: column 'ym' has unsupported type : yearmon

有没有办法让它同时适用于zoodplyr,或者我必须单独编码我的年月?

2 个答案:

答案 0 :(得分:2)

如错误所述,dplyr不支持该课程。我们可以将ym更改为dplyr支持的类,它将起作用

library(dplyr)
tst %>% 
       group_by(ym = as.numeric(ym)) %>%
       summarise(ave = mean(n))
#        ym      ave
#1 2004.000 25.00000
#2 2004.083 21.80000
#3 2004.167 23.00000
#4 2004.250 23.25000
#5 2004.333 21.66667

或者正如@ G.Grothendieck在评论中提到的那样,我们可以将group_by替换为group_by(ym = as.Date(ym)group_by(ym = format(ym, "%Y-%m"))

答案 1 :(得分:0)

也许你在dplyr 0.4.3尚未发布的时候问过这个问题,我发现升级到这个版本摆脱了错误。

(一位同事正在使用dplyr 0.4.2,这也有效:)