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

Value に対しては (Lag を使用して) 行うのは非常に簡単ですが、date-index 自体に対してはそうではありません。

おそらく、さまざまなルックアップなどを使用してそれを行う方法を理解できますが、面倒です。他のフィールドで一致させるか、「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 に答える