3

在这里改写的问题:

我已经取得了一些进展,但从 R 那里得到了奇怪的行为......

这是我开始的xts

<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

我想在每行的新列中使用 NEXT 行中的日期索引创建它的派生词:

              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       [...]

对于价值(使用滞后)很容易做到,但对于日期索引本身却不是。

我可能可以使用各种查找等来解决如何做到这一点,但它很混乱。您必须在其他字段上进行匹配,或者摆弄那些感觉不太“符合 R”的行号。

有没有一种漂亮、整洁、优雅的方式来做到这一点?

我很确定我会去“D'OH!” 只要有人给出答案!但到目前为止,我还没有在这个网站上找到滞后日期索引的答案。

我想这样做的原因是我想连续使用每一对日期来询问另一个系列。所以可能有更好的方法来做到这一点。

4

3 回答 3

2

我不确定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)
于 2012-09-15T11:24:09.707 回答
1

我认为这与您实际想要做的类似:

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) 

注意:在计算期间平均值时,这包括开始时间,不包括结束时间。

于 2012-09-15T16:29:22.007 回答
0

我相信您正在寻找的是:

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,但您应该能够通过片刻的努力从上面的日期/整数大小写到那个。

于 2013-09-26T20:50:05.270 回答