我有几年的每日价格数据作为动物园对象。 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周的数据。
提前致谢!
答案 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周。 (但数据将在月末日期结束,因为该月的最后一天可以在一周中的任何一天结束)