了解功能端点

时间:2018-06-23 20:33:10

标签: r xts endpoints dayofmonth

我有一个时间序列的回报。在第一列中,我有所有日期。有了这个功能(搜索了几个小时),我终于设法获得了每个月的第一个值。

问题在于,第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 :(得分:3)

让我们准备示例数据:

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将是第一个月第一天的索引:

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"