Как отстать от даты-индекса во временном ряду в R?

ПЕРЕСМОТРЕННЫЙ ВОПРОС ЗДЕСЬ:

Я сделал некоторый прогресс, но получаю странное поведение от R...

Вот хз я начинаю с

<no title>  Value   Value2  Value3
2002-08-21  21      2       27
2003-09-10  22      42      87
2004-02-12  23      62      67
2005-04-13  24      13      73
2006-05-13  25      4       28
2007-08-14  20      68      25
2008-03-06  19      82      22

Что я хочу произвести:

 <no title> Value   Value2  Value3  ThisDate    NextDate
    2002-08-21  21      2       27      2002-08-21  2003-09-10
    2003-09-10  22      42      87      2003-09-10  2004-02-12
    2004-02-12  23      62      67      2004-02-12  2005-04-13
    2005-04-13  24      13      73      2005-04-13  2006-05-13
    2006-05-13  25      4       28      2006-05-13  2007-08-14
    2007-08-14  20      68      25      2007-08-14  2008-03-06
    2008-03-06  19      82      22      2008-03-06  NA

Я написал такую ​​функцию:

StackUpAdjacentDates <- function(sourceTimeSeries)
{
    returnValue <- sourceTimeSeries

    thisDate <- as.character(index(sourceTimeSeries))
    nextDate <- c(as.character(thisDate[2:length(thisDate)]),NA)

    thisDate <- as.Date(strptime(thisDate, "%Y-%m-%d"))
    nextDate <- as.Date(strptime(nextDate, "%Y-%m-%d"))

    # set up thisDate in a new column
    if ("thisDate" %in% colnames(returnValue) )
    {
        returnValue<-returnValue[,-which(colnames(returnValue)=="thisDate")]
    }
    returnValue <- cbind(returnValue, thisDate)
    colnames(returnValue)[ncol(returnValue)] <- "thisDate"
    returnValue$thisDate <- thisDate

    # add nextDate in a new column
    if ("nextDate" %in% colnames(returnValue) )
    {
        returnValue<-returnValue[,-which(colnames(returnValue)=="nextDate")]
    }
    returnValue <- cbind(returnValue,nextDate)
    colnames(returnValue)[ncol(returnValue)] <- "nextDate"
    #returnValue$nextDate <- nextDate

}

Это успешно добавляет thisDate (выполнение кода пошагово в командной строке). Но бит, который добавляет nextDate, кажется, переписывает это! Я также, кажется, получаю неожиданный ряд NA. Все еще работаем над этим...

<no title>  Value   Value2  Value3  nextDate
2002-08-21  21      78      76      12305
2003-09-10  22      70      23      12460
2004-02-12  23      84      22      12886
2005-04-13  24      97      28      13281
2006-05-13  25      26      97      13739
2007-08-14  20      59      22      13944
2008-03-06  19      64      98      NA
<NA>        NA      NA      NA      NA

Я поместил "без заголовка" в первый столбец, чтобы указать, что это индекс даты xts, а не часть вектора / матрицы.

Немного о том, чтобы удалить лишнюю строку, потому что я еще не решил проблему перезаписи и экспериментировал. Это не должно быть там в окончательном ответе, но это то, где я сейчас нахожусь.

И наконец, когда я опрашиваю этот результат и пытаюсь преобразовать nextDate в дату, которую я получаю....

> as.Date(returnValue$nextDate)
Error in as.Date.default(returnValue$nextDate) : 
  do not know how to convert 'returnValue$nextDate' to class "Date"

Так что я немного запутался...

ОРИГИНАЛЬНЫЙ ВОПРОС НИЖЕ:

У меня есть временной ряд в R (который я учу быстро, но явно недостаточно быстро!), Как это

             Value
2002-08-21    21
2003-09-10    22
2004-02-12    23
2005-04-13    24
2006-05-13    25
2007-08-14    20
2008-03-06    19

Я хочу создать его производную с указателем даты в СЛЕДУЮЩЕЙ строке в новом столбце в каждой строке:

              Value    NextDate
2002-08-21    21       2003-09-10
2003-09-10    22       2004-02-12
2004-02-12    23       2005-04-13
2005-04-13    24       2006-05-13
2006-05-13    25       2007-08-14
2007-08-14    20       2008-03-06
2008-03-06    19       [...]

Это очень легко сделать для Value (используя Lag), но не для самого индекса даты.

Я, наверное, могу решить, как это сделать, используя различные поиски и тому подобное, но это грязно. Вы должны сопоставить какое-то другое поле или возиться с номерами строк, которые не кажутся очень "верными R".

Есть ли хороший, аккуратный, элегантный способ сделать это?

Я почти уверен, что пойду "D'OH!" как только кто-то даст ответ! Но до сих пор я не нашел ответа на этом сайте за отставание индекса даты.

Причина, по которой я хочу это сделать, заключается в том, что я хочу использовать каждую пару дат подряд для опроса другой серии. Так что может быть лучший способ сделать это.

3 ответа

Решение

Я думаю, что это похоже на то, что вы действительно хотите сделать:

library(xts)
#create example xts
times <- seq(as.Date('2002-08-21'),as.Date('2002-09-06 '),by="day")
myts <- xts(x=1:length(times),order.by=times)

#second xts, with start and end times
times2 <- c("2002-08-21","2002-08-31","2002-09-06")    
myts2 <- myts[times2] 

#get start and end times
ix <- index(myts2)

#get positions in myts
ep <- which(index(myts) %in% ix)-1

#calculate means
period.apply(myts,ep,mean) 

Примечание: это включает время начала и исключает время окончания при расчете среднего за период.

Я не уверен xts это лучшая вещь для того, что вы пытаетесь сделать, но для чего стоит здесь, как взять xts объект, сделать dataframe и создайте дополнительный столбец времени, который вы хотите, а затем преобразуйте его в формат времени.

 data(sample_matrix)
 x <- as.xts(sample_matrix)
 head(x)
 df <-as.data.frame(x)
 head(df)
 newdates<-rownames(df)

 df$nextdates<-c(newdates[2:length(newdates)],"NA")
 df$nextdates<-as.POSIXct(strptime(df$nextdates, "%Y-%m-%d"))
 head(df)

Я считаю, что вы ищете это:

dayDifff <- function(X)
{
    as.numeric(as.Date(index(X))) - c(NA, as.numeric(as.Date(index(X[-nrow(X)]))))
}

Где X является xts объект. Я преобразовал родной POSIXct раз в даты, и добавил NA в голову и снял окончательную дату с X[-nrow(X)],

Если у вас есть время в секундах и т. Д., Вам нужно сохранить вторую точность POSIXct, но вы должны быть в состоянии перейти от даты / целого числа выше к этому с небольшим усилием.

Другие вопросы по тегам