2015-02-11 97 views
2

甲虚设动物园对象被创建为rollapply:是否可以为每个滑动窗口添加结束日期?

z <- zoo(11:15, as.Date(31:45)) 
as.data.frame(z) 
z 
1970-02-01 11 
1970-02-02 12 
1970-02-03 13 
1970-02-04 14 
1970-02-05 15 
1970-02-06 11 
1970-02-07 12 
1970-02-08 13 
1970-02-09 14 
1970-02-10 15 
1970-02-11 11 
1970-02-12 12 
1970-02-13 13 
1970-02-14 14 
1970-02-15 15 

rollapply function can be used to calculate mean as: 
as.data.frame(rollapply(z, width=3, by=2, mean, align="left")) 

1970-02-01            12.00000 
1970-02-03            14.00000 
1970-02-05            12.66667 
1970-02-07            13.00000 
1970-02-09            13.33333 
1970-02-11            12.00000 
1970-02-13            14.00000 

格式,我想: 是否可以添加另一列(II柱/结束窗口)具有结束日期如图[使用rollapply或者使用一些其它方法下面上面使用的xts/zoo对象]

start_window end_window        mean 
1970-02-01 1970-02-03         12.00000 
1970-02-03 1970-02-05         14.00000 
1970-02-05 1970-02-07         12.66667 
1970-02-07 1970-02-09         13.00000 
1970-02-09 1970-02-11         13.33333 
1970-02-11 1970-02-13         12.00000 
1970-02-13 1970-02-15         14.00000 

请建议一种方法。由于事先

回答

2

您可以只需添加二辊的结果做一个简单的黑客将-s应用于数据帧。

#Your code 
library(zoo) 
z <- zoo(11:15, as.Date(31:45)) 
as.data.frame(z) 
as.data.frame(rollapply(z, width=3, by=2, mean, align="left")) 

数据为基准的开始和结束

frame1 <- as.data.frame(rollapply(z, width=3, by=2, mean, align="left")) 
frame2 <- as.data.frame(rollapply(z, width=3, by=2, mean, align="right")) 

将他们添加到数据帧

frame3 <- data.frame(Start = row.names(frame1), Finish = row.names(frame2), frame1[1]) 
row.names(frame3) <- c(1:length(frame3[,1])) 
names(frame3)[3] <- "Mean" 

结果

frame3 
      Start  Finish  Mean 
    1 1970-02-01 1970-02-03 12.00000 
    2 1970-02-03 1970-02-05 14.00000 
    3 1970-02-05 1970-02-07 12.66667 
    4 1970-02-07 1970-02-09 13.00000 
    5 1970-02-09 1970-02-11 13.33333 
    6 1970-02-11 1970-02-13 12.00000 
    7 1970-02-13 1970-02-15 14.00000 
+0

谢谢亲爱的puslet88,这个技巧听起来很有趣。 – bioinformatician 2015-02-11 13:46:54

3

1)zoo具有fortify.zoo方法产生的数据帧与Index柱所以假设r是在问题给出的rollapply的输出。然后,对于第3宽度的结束日期超过2天过去相应的起始日期,以便:

library(ggplot2) 
r <- rollapply(z, width=3, by=2, mean, align="left") # as in question 

DF <- transform(fortify(r), end_date = Index + 2) 

giving: 

> DF 
     Index  r end_date 
1 1970-02-01 12.00000 1970-02-03 
2 1970-02-03 14.00000 1970-02-05 
3 1970-02-05 12.66667 1970-02-07 
4 1970-02-07 13.00000 1970-02-09 
5 1970-02-09 13.33333 1970-02-11 
6 1970-02-11 12.00000 1970-02-13 
7 1970-02-13 14.00000 1970-02-15 

如果列顺序和列名必须尽可能然后所示:

DF <- setNames(DF[c(1, 3:2)], c("start_date", "end_date", "mean")) 

2)假设从上面r,这也将工作:

data.frame(start_date = time(r), end_date = time(r) + 2, mean = coredata(r)) 
+0

由于亲爱G.格罗滕迪克,感谢赋予这种有用的功能。我将能够解决我的问题:) – bioinformatician 2015-02-11 13:48:27

相关问题