Извлечь возврат из первого рабочего дня месяца из объекта XTS с помощью R

Я очень плохо знаком с R, поэтому извиняюсь, если я неправильно понял терминологию, когда объясняю эту проблему.

У меня есть набор данных ежедневных возвратов в CSV-файл, который мне удалось преобразовать в объект XTS. Данные в формате:

           HighYield..EUR. MSCI.World..EUR.
2002-01-31          0.0144           0.0031    
2002-02-01          0.0056          -0.0132       
2002-02-02          0.0373           0.0356       
2002-02-03         -0.0167          -0.0644      
2002-02-04         -0.0062          -0.0332      
2002-02-05         -0.0874          -0.1112 
...

Я хочу создать скрипт, который найдет первый рабочий день месяца (из диапазона значений в индексе), а затем создаст новый объект xts с этими возвратами в нем.

Например, после запуска скрипта у меня будет объект xts в формате:

           HighYield..EUR. MSCI.World..EUR.
2002-01-31          0.0144           0.0031    
2002-02-28          0.0011          -0.0112       
2002-03-31          0.0222           0.0224       
2002-04-30         -0.0333          -0.0223      
2002-05-30         -0.0011          -0.0012      
2002-06-30         -0.0888          -0.0967 
...

Может кто-то помочь мне, пожалуйста? и, если возможно, объясните, что делает каждая часть сценария.

 Carl Witthoft12 июн. 2012 г., 13:19
Ваш пример показывает последний день каждого месяца, но неважно. Существует множество способов получить определенные даты, вплоть до таких ключей, как (псевдокод)if (month(dateval[i]>month(dateval[i-1]) then { copy this i-th row to output} Начните с просмотра пакетаlubridate для полезных функций, связанных с датой.

Ответы на вопрос(1)

вы можете сделать это в одну строку:

 library(xts)
 data(sample_matrix)
 x <- as.xts(sample_matrix)
 do.call(rbind, lapply(split(x, "months"), first))

Чтобы объяснить, что делает каждый шаг:

 # Split the xts object into a list with an element for each month.
 x1 <- split(x, "months")
 # Loop over the list (x1) and call the first() function on each element.
 # This returns a new list where each element only contains the first observation
 # from each respective element in x1.
 x2 <- lapply(x1, first)
 # Call rbind() with all the elements of x2 as arguments to rbind()
 # Same as rbind(x2[[1]], x2[[2]], ..., x2[[N]])
 x3 <- do.call(rbind, x2)
 GreenyMcDuff12 июн. 2012 г., 15:41
Джошуа, ты ученый и джентльмен. Я у тебя в долгу.
 A5C1D2H2I1M1N2O1R2T122 окт. 2012 г., 13:55
@ JoshuaUlrich, круто. Мне просто было любопытно. Я проверю пакет, который вы предложили, хотя я собираюсь выйти на конечность и предположить, что индийские праздники не являются частью этого пакета;)
 Joshua Ulrich22 окт. 2012 г., 13:47
@ mrdwab: да, это хороший момент. Мой ответ предполагает, что объект содержит только рабочие дни. Ваш лучше, но все же не исключает каких-либо потенциальных каникул. TimeDate пакет имеет хорошие функции для этого.
 A5C1D2H2I1M1N2O1R2T122 окт. 2012 г., 09:06
Если мы предполагаем, что «первый рабочий день» буквально исключает субботу и воскресенье, не следует ли нам использоватьdo.call(rbind, lapply(split(x[.indexwday(x) %in% 1:5], "months"), first))? Или есть еще лучший способ сделать это с помощью xt

Ваш ответ на вопрос