Как отстать от даты-индекса во временном ряду в 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
, но вы должны быть в состоянии перейти от даты / целого числа выше к этому с небольшим усилием.