如何为R中动物园对象的每个月的上一周进行子集化?

时间:2014-05-18 11:53:26

标签: r xts zoo

我有几年的每日价格数据作为动物园对象。 R中每个月的最后一周的最佳方法是什么?

以下是您可以复制它的方法:

set.seed(123)
price <- rnorm(365)
data <- cbind(seq(as.Date("2013-01-01"), by = "day", length.out = 365), price)
zoodata <- zoo(data[,2], as.Date(data[,1]))

我尝试了这个选项,但它只返回整个数据集的最后一周。

do.call(rbind, lapply(split(zoodata, "months"), last, "1 week"))

产生的结果是:

2013-12-30 2013-12-31 
 1.0246732  0.8176594 

我希望每个月的最后一周能够获得至少12周的数据。

提前致谢!

2 个答案:

答案 0 :(得分:2)

这是使用xts包的方法

## Create sample data
library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix)
##

# split by month, and apply the last() function to each group
lapply(split(x, "months"), last, "1 week") 

如果您希望结果是单个对象,可以使用rbind

do.call列表
do.call(rbind, lapply(split(x, "months"), last, "1 week"))
               Open     High      Low    Close
2007-01-29 49.85624 49.93038 49.76308 49.91875
2007-01-30 49.85477 50.02180 49.77242 50.02180
2007-01-31 50.07049 50.22578 50.07049 50.22578
2007-02-26 50.88168 50.88168 50.75481 50.75481
2007-02-27 50.74333 50.78909 50.61874 50.69206
2007-02-28 50.69435 50.77091 50.59881 50.77091
2007-03-26 48.34210 48.44637 48.28969 48.28969
2007-03-27 48.25248 48.41572 48.23648 48.30851
2007-03-28 48.33090 48.53595 48.33090 48.53595
2007-03-29 48.59236 48.69988 48.57432 48.69988
2007-03-30 48.74562 49.00218 48.74562 48.93546
2007-03-31 48.95616 49.09728 48.95616 48.97490
2007-04-30 49.13825 49.33974 49.11500 49.33974
2007-05-28 47.90142 47.93398 47.64718 47.64718
2007-05-29 47.65665 47.89342 47.65446 47.87252
2007-05-30 47.78866 47.93267 47.78866 47.83291
2007-05-31 47.82845 47.84044 47.73780 47.73780
2007-06-25 47.20471 47.42772 47.13405 47.42772
2007-06-26 47.44300 47.61611 47.44300 47.61611
2007-06-27 47.62323 47.71673 47.60015 47.62769
2007-06-28 47.67604 47.70460 47.57241 47.60716
2007-06-29 47.63629 47.77563 47.61733 47.66471
2007-06-30 47.67468 47.94127 47.67468 47.76719

注意:如果它很重要,您可以在其周围包裹as.zoo(),但xts个对象是zoo个对象,因此可能没有必要。

答案 1 :(得分:1)

尝试

lapply(split(as.xts(zoodata), "months"), FUN = function(x) last(x,"1 week"))

这将给每个月的最后1周。 (但数据将在月末日期结束,因为该月的最后一天可以在一周中的任何一天结束)