2011-10-15 102 views
2

我有以下形式的數據集。POSIX變量按年份和月份彙總

 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 

對我來說,時間(小時,分,秒)和星期幾是無關緊要的,但我想通過country,年份和月份聚集變量「X」的值。有沒有任何直接的方法來做到這一點?

+0

這將依賴於T他是「國家」和「數據時間」專欄的課程。我們可以猜測「國家」是一個因素變量,「datatime」是POSIXct,但如果你在對象上發佈了str()會更好。在沒有你的指示的情況下,我們還需要猜測你想要什麼樣的聚合。和?意思?馬克斯? –

回答

4

最簡單的方法是使用strftimedatetime設置爲只包含年份和月份的字符向量。

假設你列datetimePOSIXct類的,你的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 
+0

完美。完善!謝謝,安德里。出於好奇,是否有任何解析年份,月份和周的方法? – user702432

+0

您可以通過「%U」或「%W」輕鬆指定週數(即1月的第一週爲1,12月的最後一週爲〜52)。這些選項在'?strptime'的幫助頁面底部進行了描述。 – Andrie

+0

最有幫助。非常感謝。 – user702432

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 

注意,人們可以加上1900 POSIXlt年值一年就可以收回,並使用一個月值作爲索引將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 
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