21

列に格納された複数の時系列のリターンを含むデータ フレームがあります。

最初の列には日付が含まれ、後続の列はそれぞれ名前を持つ独立した時系列です。列ヘッダーは変数名です。

## I have a data frame like this
t <- seq(as.Date('2009-01-01'),by='days',length=10)
X <- rnorm(10,0,1)
Y <- rnorm(10,0,2)
Z <- rnorm(10,0,4)

dat <- data.frame(t,X,Y,Z)

## which appears as
           t          X          Y         Z
1 2009-01-01 -1.8763317 -0.1885183 -6.655663
2 2009-01-02 -1.3566227 -2.1851226 -3.863576
3 2009-01-03 -1.3447188  2.4180249 -1.543931

各時系列をラティスの個別のプロットに線としてプロットし、各プロットに変数名でラベルを付けたいと思います。

これをラティスでプロットするには、データは次のように縦長の形式である必要があります。

           t symbol       price
1 2009-01-01      X -1.8763317
2 2009-01-02      Y -0.1885183
2 2009-01-02      Z -6.655663

これを行うための適切な関数呼び出しは何ですか?

4

5 に答える 5

18

「reshape」ライブラリのmelt()を使用することもできます(reshape()自体よりも使いやすいと思います)-これにより、時間列を再度追加する必要があるという余分な手順が節約されます...

> library(reshape)
> m <- melt(dat,id="t",variable_name="symbol")
> names(m) <- sub("value","price",names(m))
> head(m)
           t symbol       price
1 2009-01-01      X -1.14945096
2 2009-01-02      X -0.07619870
3 2009-01-03      X  0.01547395
4 2009-01-04      X -0.31493143
5 2009-01-05      X  1.26985167
6 2009-01-06      X  1.31492397
> class(m$t)
[1] "Date"
> library(lattice)                                                              
> xyplot( price ~ t | symbol, data=m ,type ="l", layout = c(1,3) )

ただし、この特定のタスクについては、データ フレームを再形成する必要がない「zoo」ライブラリの使用を検討します。

> library(zoo)                                                                  
> zobj <- zoo(dat[,-1],dat[,1])                                                 
> plot(zobj,col=rainbow(ncol(zobj))) 

R の開発者/貢献者 (この場合は Gabor と Hadley) は、多くの素晴らしい選択肢を提供してくれました。(格子パッケージの Deepayan を忘れることはできません)

于 2009-07-28T06:29:20.270 に答える
11

多変量時系列の場合は、同名のパッケージを利用して Zoo オブジェクトとして格納することを検討してください。これにより、インデックス作成、マージ、サブセット化がはるかに簡単になります --- 動物園のビネットを参照してください。

しかし、あなたが格子プロットについて尋ねたように、これも可能です。この例では、日付列、値列「val」、変数 ID 列「var」を含む単純な「long」data.frame を作成します。

> set.seed(42)
> D <- data.frame(date=rep(seq(as.Date("2009-01-01"),Sys.Date(),by="week"),2),\
                  val=c(cumsum(rnorm(30)), cumsum(rnorm(30))), \
                  var=c(rep("x1",30), rep("x2",30)))

そのデータセットを考えると、説明ごとのプロットは、「変数でグループ化されたデータを指定した値」のプロットを要求することにより、格子パッケージの xyplot によって行われ、各パネルで線をオンにします。

> library(lattice)
> xyplot(val ~ date | var, data=D, panel=panel.lines)
于 2009-07-25T03:07:18.407 に答える
5

最初の列に日付があり、他の各列に値があるデータフレーム「temp」の場合:

> par(mfrow=c(3,4)) # 3x4 grid of plots
> mapply(plot,temp[,-1],main=names(temp)[-1],MoreArgs=list(x=temp[,1],xlab="Date",type="l",ylab="Value") )
于 2009-07-25T03:18:43.100 に答える
3

回答してくれた皆さんに感謝します-Dirkの回答は的を射ていました。

欠落しているステップは、「stack()」関数を使用してデータ フレームをワイド フォーマットからロング フォーマットに変換することであることが判明しました。reshape() 関数を使用してこれを行う簡単な方法があるかもしれないことは承知しています。誰かが投稿したい場合は、例を見て喜んでください。

それで、質問で言及された「dat」データフレームを使用して、私がやったことは次のとおりです。

## use stack() to reshape the data frame to a long format
## <time> <stock> <price>
stackdat <- stack(dat,select=-t) 
names(stackdat) <- c('price','symbol')

## create a column of date & bind to the new data frame
nsymbol <- length(levels(stackdat$symbol))  
date <- rep(dat$t, nsymbol)  
newdat <- cbind(date,stackdat)

## plot it with lattice
library(lattice)
xyplot(price ~ date | symbol,  ## model conditions on 'symbol' to lattice
       data=newdat,            ## data source
       type='l',               ## line
       layout=c(nsymbol,1))    ## put it on a single line

## or plot it with ggplot2
library(ggplot2)
qplot(date, price, data = newdat, geom="line") + facet_grid(. ~ symbol)
于 2009-07-25T22:51:54.827 に答える