Попробуйте использовать класс "yearmon"
в зоопарке, так как он сортируется соответствующим образом.Ниже мы создаем образец фрейма данных DF
, а затем добавляем столбец YearMonth
класса "yearmon"
.Наконец мы выполняем нашу агрегацию.Фактическая обработка - это только две последние строки (другая часть предназначена только для создания образца фрейма данных).
Lines <- "Instrument AccountValue monthYear ExitTime
JPM 6997 april-07 2007-04-10
JPM 7261 mei-07 2007-05-29
JPM 7545 juli-07 2007-07-18
JPM 7614 juli-07 2007-07-19
JPM 7897 augustus-07 2007-08-22
JPM 7423 november-07 2007-11-02
KFT 6992 mei-07 2007-05-14
KFT 6944 mei-07 2007-05-21
KFT 7069 juli-07 2007-07-09
KFT 6919 juli-07 2007-07-16"
library(zoo)
DF <- read.table(textConnection(Lines), header = TRUE)
DF$YearMonth <- as.yearmon(DF$ExitTime)
aggregate(AccountValue ~ YearMonth + Instrument, DF, sum)
Это дает следующее:
> aggregate(AccountValue ~ YearMonth + Instrument, DF, sum)
YearMonth Instrument AccountValue
1 Apr 2007 JPM 6997
2 May 2007 JPM 7261
3 Jul 2007 JPM 15159
4 Aug 2007 JPM 7897
5 Nov 2007 JPM 7423
6 May 2007 KFT 13936
7 Jul 2007 KFT 13988
Несколько иной подходи вывод использует read.zoo
напрямую.Он производит один столбец на инструмент и одну строку в год / месяц.Мы читаем в столбцах, присваивая им соответствующие классы, используя "NULL"
для столбца monthYear
, поскольку мы не будем его использовать.Мы также указываем, что индекс времени - это 3-й столбец оставшихся столбцов, и мы хотим, чтобы входные данные были разделены на столбцы по 1-му столбцу.FUN=as.yearmon
указывает, что мы хотим, чтобы индекс времени был преобразован из класса "Date"
в класс "yearmon"
, и мы объединяем все, используя sum
.
z <- read.zoo(textConnection(Lines), header = TRUE, index = 3,
split = 1, colClasses = c("character", "numeric", "NULL", "Date"),
FUN = as.yearmon, aggregate = sum)
Полученный объект зоопарка выглядит следующим образом:
> z
JPM KFT
Apr 2007 6997 NA
May 2007 7261 13936
Jul 2007 15159 13988
Aug 2007 7897 NA
Nov 2007 7423 NA
Мы можем предпочесть сохранить его как объект зоопарка, чтобы воспользоваться другими функциями в зоопарке, или мы можем преобразовать его во фрейм данных, например так: data.frame(Time = time(z), coredata(z))
, который делает время отдельным столбцом или as.data.frame(z)
, который использует имена строк для времени.fortify.zoo()z)
тоже работает.