Создание столбца индекса на основе месяцев по годам

Я хочу создать столбец индекса, который учитывает период с октября месяца года по сентябрь следующего года. Вот большой пример данных, чтобы подчеркнуть суть вопроса. Обратите внимание на настройки панели данных. Предположим, я пытаюсь вычислить среднее значение A для каждой акции в этом окне, например. С октября 2001 г. по сентябрь 2012 г. Когда у меня появится столбец Index, я выполню следующее:

meanDF = aggregate(cbind(A) ~ Index + Firm, df, FUN = mean)

Я буду выполнять множество настраиваемых операций, кроме вычисления среднего, поэтому я могу легко заменить свою настраиваемую функцию в приведенном выше коде. Пожалуйста помоги. Большое тебе спасибо.


person Polar Bear    schedule 13.06.2016    source источник
comment
Я думаю, вам нужно извлечь месяц, год и использовать его в качестве переменной группировки.   -  person akrun    schedule 13.06.2016
comment
Преобразуйте дату в класс Date с as.Date и используйте format для преобразования в год месяц.   -  person akrun    schedule 13.06.2016
comment
Используйте это как переменную группировки. Я предполагаю, что вам интересно получить среднее значение вместо некоторого индекса.   -  person akrun    schedule 13.06.2016
comment
Нет. Индекс важен, потому что я буду использовать его для многих других индивидуальных расчетов, помимо среднего   -  person Polar Bear    schedule 13.06.2016
comment
Если вам нужен числовой индекс, преобразуйте год и месяц (полученный из format) в factor, а затем приведите к numeric.   -  person akrun    schedule 13.06.2016
comment
Господин противник, если вы не можете решить эту проблему, это не значит, что она не может быть решена.   -  person Polar Bear    schedule 13.06.2016
comment
@akrun, не могли бы вы помочь мне написать цикл для формирования матрицы и создания индекса, как показано в ответе? Заранее спасибо.   -  person Polar Bear    schedule 13.06.2016


Ответы (1)


Я сделал столбец индекса ('ггмм') с вашими данными, чтобы он отображался в четырехзначном числовом формате, например 1110 за октябрь 2011 года.

dat <- read.csv("./input/p_df.csv")
dat$Date <- as.character(dat$Date)
dat$Date<-as.Date(dat$Date, format="%m/%d/%Y")
dat$yymm <- format(dat$Date, format="%y%m")

Создайте матрицу с датой начала и датой окончания для каждого периода с октября по сентябрь:

dd <- structure(c(1110, 1209, 1210, 1309, 1310, 1409, 1410, 1509), .Dim = c(2L, 4L))

     [,1] [,2] [,3] [,4]
[1,] 1110 1210 1310 1410
[2,] 1209 1309 1409 1509

Подмножество данных в 4 отдельных кадра data.frame, соответствующих начальному-конечному периоду матрицы:

df2<-lapply(1:4, function(x)dat %>% filter(mmyy >= dd[1,x] & mmyy <= dd[2,x]))

Сгруппируйте каждый набор данных по фирмам и просуммируйте среднее значение запасов (от A до F):

plyr::llply(df2, function(x) x %>% group_by(Firm) %>% select(A:F) %>% summarise_each(funs(mean)))

[[1]]
Source: local data frame [5 x 7]

            Firm        A       B        C        D         E         F
          (fctr)    (dbl)   (dbl)    (dbl)    (dbl)     (dbl)     (dbl)
1  BOB IS Equity 145.9267 3316808 62.52732 84.29513 1957.7310  285642.5
2 GAIL IS Equity 370.0094 1106420 49.80055 82.06510 1268.4775  469232.8
3  ITC IS Equity 227.2641 6970928 48.01366 67.84061 7809.3682 1778660.0
4   MM IS Equity 720.6503 1704623 53.01366 36.21561  613.9769  443013.4
5  RIL IS Equity 771.9296 3915459 47.72951 22.04312 3274.5789 2528920.7

[[2]]
Source: local data frame [5 x 7]

            Firm        A       B        C        D         E         F
          (fctr)    (dbl)   (dbl)    (dbl)    (dbl)     (dbl)     (dbl)
1  BOB IS Equity 137.7357 5329819 64.82192 81.98227 2055.4590  281634.8
2 GAIL IS Equity 333.9021 1148524 53.84932 82.13927 1268.4770  423761.6
3  ITC IS Equity 311.1275 7100443 46.88767 74.57744 7890.6657 2456360.8
4   MM IS Equity 898.4038 1329277 55.72329 46.41512  614.4784  552200.7
5  RIL IS Equity 833.1956 3224021 50.81096 49.91264 3245.9668 2703932.9

[[3]]
Source: local data frame [5 x 7]

            Firm         A       B        C        D         E         F
          (fctr)     (dbl)   (dbl)    (dbl)    (dbl)     (dbl)     (dbl)
1  BOB IS Equity  146.6735 8628298 58.94795 81.65596 2133.6639  314165.4
2 GAIL IS Equity  383.4397 1279186 46.99178 82.22435 1268.4770  487096.0
3  ITC IS Equity  337.2251 6373170 49.96164 76.48013 7946.3991 2681621.5
4   MM IS Equity 1062.1181 1057952 53.12877 53.80728  616.1057  656305.1
5  RIL IS Equity  934.2914 3138729 47.23288 60.38028 3232.1816 3023599.4

[[4]]
Source: local data frame [5 x 7]

            Firm         A       B        C        D        E         F
          (fctr)     (dbl)   (dbl)    (dbl)    (dbl)    (dbl)     (dbl)
1  BOB IS Equity  181.0604 6415760 54.68493 85.77090 2176.903  394006.5
2 GAIL IS Equity  398.5686 1480755 40.84932 83.58569 1268.477  504064.4
3  ITC IS Equity  341.9144 7534123 44.30411 78.84935 8005.011 2736656.1
4   MM IS Equity 1250.7123 1084946 46.51781 62.64578  621.092  777771.6
5  RIL IS Equity  914.7201 3571817 42.55068 59.33441 3236.035 2960117.6

Чтобы создать Индекс для каждого периода:

for(i in 1:nrow(dat)){
  dat[i,"Index"]<- ifelse(dat[i,"mmyy"] >= dd[1,1] &  dat[i,"mmyy"] <= dd[2,1], 1, 
                         ifelse(dat[i,"mmyy"] >= dd[1,2] &  dat[i,"mmyy"] <= dd[2,2], 2, 
                                ifelse(dat[i,"mmyy"] >= dd[1,3] &  dat[i,"mmyy"] <= dd[2,3], 3, 4)))
}
person Adam Quek    schedule 13.06.2016
comment
Спасибо. Я хочу найти среднее значение для каждого окна для всех акций. Пожалуйста, обратите внимание на настройки панели данных. Вы также можете взглянуть на этот вопрос, почему я использую метод, который использую для среднего: stackoverflow.com/questions/35817981/ - person Polar Bear; 13.06.2016
comment
Добавлен способ агрегирования по фирме и ггмм. - person Adam Quek; 13.06.2016
comment
Я не хочу скупать на месяц. Я хотел найти средство для всех окон всех Акций. Предположим, у меня есть данные за 4 года, начиная с октября 2011 года по сентябрь 2014 года, и есть запасы x, y и Z. Таким образом, будет 3 окна и, следовательно, 3 средних значения для каждой из акций x, y и z. - person Polar Bear; 13.06.2016
comment
На самом деле первый ответ на указанный вопрос работает нормально, но теперь мой расчет сместился с обычного января-декабря на октябрь-сентябрь. И я постарался выделить это в заголовке. Спасибо еще раз - person Polar Bear; 13.06.2016
comment
Пожалуйста, попробуйте сделать вычисление матрицы и цикл автоматическим (может быть цикл for). Я уже проголосовал за него и приму ответ, когда запрошенный ответ будет предоставлен - person Polar Bear; 13.06.2016