按年份和月份汇总POSIX变量

时间:2011-10-15 13:57:51

标签: r

我有以下表格的数据集。

        country            datetime       x
1 United States 2008-01-01 00:00:00 5962.06
2 United States 2008-01-02 00:00:00 6002.74
3 United States 2008-01-03 00:00:00 6040.98
4 United States 2008-01-04 00:00:00 6031.44
5 United States 2008-01-05 00:00:00 6029.91
6 United States 2008-01-06 00:00:00 6025.24

对我来说,时间(小时,分钟,秒)和星期几是无关紧要的,但我希望将变量“x”的值汇总为country,年份和月份。有没有直截了当的方法呢?

3 个答案:

答案 0 :(得分:4)

最简单的方法是使用strftimedatetime格式化为仅包含年份和月份的字符向量。

假设您的专栏datetime属于班级POSIXct,并且您的data.frame被称为dat

dat$shortdate <- strftime(dat$datetime, format="%Y/%m")
dat
        country   datetime       x shortdate
1 United States 2008-01-01 5962.06   2008/01
2 United States 2008-01-02 6002.74   2008/01
3 United States 2008-01-03 6040.98   2008/01
4 United States 2008-01-04 6031.44   2008/01
5 United States 2008-01-05 6029.91   2008/01
6 United States 2008-01-06 6025.24   2008/01

然后使用您最喜欢的聚合方法来汇总数据是一件简单的事情。例如,使用plyr

library(plyr)
ddply(dat, .(shortdate), summarize, mean_x=mean(x))

  shortdate   mean_x
1   2008/01 6015.395

答案 1 :(得分:1)

鉴于Andrie的更好解决方案,这将主要是POSIXlt插图中的练习。使用上面提到的变量类的假设并使用mean作为聚合函数:

aggregate(dfrm$x, list(dfrm$country, as.POSIXlt(dfrm$datetime)$year, 
                       as.POSIXlt(dfrm$datetime)$mon), FUN=mean)
         Group.1 Group.2 Group.3        x
1  United States     108       0 6015.395

请注意,可以在POSIXlt年份值中添加1900以恢复一年,并使用月份值作为R常量向量'month.abb'的索引,并添加漂亮的列标签:

aggregate(dfrm$x, list(Country=dfrm$country, 
                       Year=1900+as.POSIXlt(dfrm$datetime)$year, 
                       Month=month.abb[1+as.POSIXlt(dfrm$datetime)$mon]), 
FUN=mean)
         Country Year Month        x
1  United States 2008   Jan 6015.395

答案 2 :(得分:1)

您可以使用zoo::as.yearmon

 aggregate(x ~ country * as.yearmon(datetime), FUN=mean, data=dat)

 as.yearmon(datetime)       country        x
1             ene 2008 United States 6015.395