这是一种对head 和tail 使用负值的方法:
SPX <- getSymbols("^GSPC", src="yahoo", auto.assign=FALSE)
do.call(rbind, lapply(split(SPX, 'months'), function(x) tail(head(x, -2), -9)))
它按“月”分割,然后对每个月应用一个函数。该函数获取xts 中除最后 2 天外的所有天数中除前 9 天外的所有天数。最后,rbind 将结果合并成一个单独的xts 对象。
编辑:
您可以使用xts::first 和xts::last 代替head 和tail,这样它就可以使用除每日以外的频率。
do.call(rbind, lapply(split(SPX, 'months'), function(x) {
first(xts::last(x, "-2 days"), "-9 days")
}))
更新地址评论:
如果要对子集进行其他操作,则需要检查以确保至少有 1 行数据。如果对于给定的月份,您的 xts 对象在 9 号之后和 2 号到最后一天之前没有几天,则上面的匿名函数将返回 NULL。
do.call(rbind, lapply(split(SPX, 'months'), function(x) {
dat <- first(xts::last(x, "-2 days"), "-9 days")
if (NROW(dat) > 0) OpCl(dat)
}))
不过,在这种情况下,您可以在我的原始答案的结果上调用 OpCl() 以获得相同的结果。
tmp <- do.call(rbind, lapply(split(SPX, 'months'), function(x) {
first(xts::last(x, "-2 days"), "-9 days")
}))
OpCl(tmp)