Понимание конечных точек функций - PullRequest
0 голосов
/ 23 июня 2018

У меня есть временной ряд возвратов. В первой колонке у меня есть все мои даты. С помощью этой функции (поиск по часам) мне наконец-то удалось получить первое значение каждого месяца.

Проблема заключалась в том, что не всегда день 1 является первым значением. Иногда это день 2,3,4,5 и т. Д.

К счастью, с этой функцией все работает:

library(xts)
month<- data[,1] ## all my dates    
first.values <- month[head(endpoints(month, "months") + 1, -1)]

Что я хочу понять, хотя: почему +1 и -1? Это все, что я хотел бы понять.

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

1 Ответ

0 голосов
/ 24 июня 2018

Подготовим пример данных:

month <- seq.Date(from=Sys.Date()-5,to=Sys.Date()+10,by="day")

# [1] "2018-06-18" "2018-06-19" "2018-06-20" "2018-06-21" "2018-06-22" "2018-06-23" "2018-06-24" "2018-06-25" "2018-06-26"
# [10] "2018-06-27" "2018-06-28" "2018-06-29" "2018-06-30" "2018-07-01" "2018-07-02" "2018-07-03"

xts::endpoints дает индекс последнего наблюдения каждого месяца, всегда начинающийся с 0:

library(xts)
endpoints(month, "months") 
# [1]  0 13 16

Таким образом, если вы добавите 1, у вас будет индекс первого доступного дня следующего месяца и, что удобно, 0 будет индексом 1-го дня 1-го месяца:

endpoints(month, "months") + 1
# [1]  1 14 17

Последнее значение не имеет смысла, поэтому мы отбрасываем его:

head(endpoints(month, "months") + 1, -1)
# [1]  1 14

И мы получим ваше решение:

first.values <- month[head(endpoints(month, "months") + 1, -1)]
# [1] "2018-06-18" "2018-07-01"

Альтернативный способ сделать это:

month <- as.xts(month)
first_as_list <- lapply(split(month,f="month"), function(x) index(x)[1])
do.call(c,first_as_list)
# [1] "2018-06-18" "2018-07-01"
...