Расколотая, радостная парадигма.легко возвращать списки чисел вместо индекса даты - PullRequest
0 голосов
/ 19 сентября 2019

Я занимаюсь анализом временных рядов в наборе данных сезонов Red Sox.Мне нужно разбивать набор данных год за годом и делать некоторые вычисления, поэтому я почти уверен, что мне нужно использовать парадигму split, lapply, rbind.Я передаю двоичный столбец xts (выигрыш / проигрыш) в функцию split, пока что все хорошо, он возвращает список правильно разделенных xts по годам.

Затем я запустил laply в этом списке, чтобы вычислитькумулятивное среднее значение выигрыша / проигрыша за каждый год, числовой результат в порядке, но он преобразует объекты xts в числовые векторы, поэтому я теряю свой индекс Date.

Что может быть источником этой проблемы?

спасибо!

head of red_sox_xts $ win.

            win
2010-04-04   1
2010-04-06   0
2010-04-07   0
2010-04-09   0
2010-04-10   1
2010-04-11   1

1 - подача в эту функцию для разделения на год.

red_sox_seasons <- split(red_sox_xts$win, f = 'years')

вывод:

[[1]]
            win
2010-04-04   1
2010-04-06   0
     .       .
     .       .
     .       .
[[2]]
            win
2011-04-01   0
2011-04-02   0
     .       .
     .       .
     .       .

2 - Далее я передаю этот вывод в функцию lapply.

red_sox_ytd <- lapply(red_sox_seasons, cummean)

output: (Здесь начинается странное поведение)

1.   A.1
     B.0.5
      .
      .
      .
2.   A.0
     B.0.5
      .
      .
      .

class (red_sox_ytd) являетсяКласс списка (red_sox_ytd [[1]]) является числовым, в то время как он должен быть xts

Это не позволяет мне выполнить следующий шаг правильно:

do.call(rbind, red_sox_ytd)

1 Ответ

1 голос
/ 19 сентября 2019

Предполагая x, показанное в примечании в конце, мы можем вычислить cummean по годам, используя ave:

transform(x, cummean = ave(win, format(time(x), "%Y"), FUN = cummean))
##            win   cummean
## 2010-04-04   1 1.0000000
## 2010-04-06   0 0.5000000
## 2010-04-07   0 0.3333333
## 2010-04-09   0 0.2500000
## 2010-04-10   1 0.4000000
## 2010-04-11   1 0.5000000

Другой подход (но более длительный):

do.call("rbind", lapply(split(x, "years"), transform, cummean = cummean(win)))

Примечание

Lines <- "date win
2010-04-04   1
2010-04-06   0
2010-04-07   0
2010-04-09   0
2010-04-10   1
2010-04-11   1"
library(xts)
x <- as.xts(read.zoo(text = Lines, header = TRUE, drop = FALSE))
...