我试图将动物园数据集中除最近五天之外的所有日期提取到单个对象中。
此问题与How do I subset the last week for every month of a zoo object in 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]))
对于我的输出,我希望获得除每个月的最后五天之外的所有内容的组合数据集。例如,如果第一个月的数据有20天,第二个月有19天,我只想分别对前15天和14天的数据进行子集。
我尝试使用head()
函数和first()
函数来提取前三周,但由于每个月根据月份或闰年数量会有不同的天数,因此它会&#39 ;不理想。
谢谢。
答案 0 :(得分:1)
与你的另一个问题的答案完全相同:
按月拆分数据集,删除最近5天,只需添加&#34; - &#34;:
library(xts)
xts.data <- as.xts(zoodata)
lapply(split(xts.data, "months"), last, "-5 days")
同样的方法,如果你想在一个对象上使用它:
do.call(rbind, lapply(split(xts.data, "months"), last, "-5 days"))
答案 1 :(得分:1)
以下是一些方法:
1)as.Date 让tt
成为日期。然后我们计算一个与Date
长度相同的tt
向量,该向量具有相应的月份最后日期。然后,我们挑选出距离该日期至少5天的日期:
tt <- time(zoodata)
last.date.of.month <- as.Date(as.yearmon(tt), frac = 1)
zoodata[ last.date.of.month - tt >= 5 ]
2)tapply / head 每个月对数据进行head(x, -5)
,然后将减少的月份连接在一起:
do.call("c", tapply(zoodata, as.yearmon(time(zoodata)), head, -5))
3)ave 定义给定vector或zoo对象的revseq
以相反的顺序返回序列号,以便最后一个元素对应1.然后使用ave
创建与ix
长度相同的向量zoodata
,它将这些反向序列号分配给每个月的日期。因此,该月最后一天的ix
值将为1,对于倒数第二天2,等等。最后将zoodata
子集分配给对应于大于5的序列号的那些元素:
revseq <- function(x) rev(seq_along(x))
ix <- ave(seq_along(zoodata), as.yearmon(time(zoodata)), FUN = revseq)
z <- zoodata[ ix > 5 ]
已添加解决方案(1)和(2)。