2015-02-11 1 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

Вы можете сделать простой хак, просто добавив результаты два рулона apply-s в dataframe.

#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" 

Result

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

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

Спасибо Дорогой Г. Гротендик, спасибо за предоставляя такую ​​полезную функцию. Я бы смог решить свою проблему :) – bioinformatician

Смежные вопросы