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

Пожалуйста, предложите способ сделать это. заранее спасибо


person bioinformatician    schedule 11.02.2015    source источник


Ответы (2)


Вы можете сделать простой хак, просто добавив результаты двух rollapply-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
person puslet88    schedule 11.02.2015

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))
person G. Grothendieck    schedule 11.02.2015
comment
Спасибо Уважаемый Г. Гротендик, Спасибо за предоставление такой полезной функции. Я бы смог решить свою проблему :) - person bioinformatician; 11.02.2015