我有以下表格的数据集。
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
,年份和月份。有没有直截了当的方法呢?
答案 0 :(得分:4)
最简单的方法是使用strftime
将datetime
格式化为仅包含年份和月份的字符向量。
假设您的专栏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