Агрегировать по году и месяцу для переменной POSIX - PullRequest
2 голосов
/ 15 октября 2011

У меня есть набор данных следующей формы.

        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 ]

4 голосов
/ 15 октября 2011

Самый простой способ - это использовать 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 голос
/ 16 октября 2011

Вы можете использовать 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
1 голос
/ 15 октября 2011

Учитывая лучшее решение Андри, это будет в основном упражнение на иллюстрации 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...