7

データファイルの日付は、時系列データの場合は1975M1、1975M2、...2011M12の形式です。Rを使用してこのデータをプロットする場合、x軸に月を目盛り軸に表示する必要があります。

日付を正しく読み取るために、Mを-に置き換えて%Y-%m形式を取得しようとしましたが、おそらく%Y-%M-%d形式を必要とするhydroTSMパッケージのdrawTimeAxisには適していません。目盛り寸法の寸法数が正しくないというエラーが発生します。

のようにデータを解析およびフォーマットし、日付を読み取らずにエラーが発生する別の方法x$newdate <- strptime(as.character(x$date), "%Y-%m")...format(x$newdate,""%Y-%m") すべてNA。

date <-as.Date(data [、1]文字列が標準の明確な形式ではなく、ts <-read.zoo(xts、as.yearmon(x [、1]))がデータに不正なエントリを与えるというエラー行。

このデータを日付情報で読み取る方法の解決策を教えてください。

データファイルの小さなサブセット

date    x   x2
1975M1  112.44  113.12
1975M2  113.1   114.36
1975M3  115.04  114.81
1975M4  117.65  115.35
1975M5  119.5   116.92
1975M6  121.4   118.56
1975M7  120.64  118.97
1975M8  119.12  119.84
1975M9  118.91  120.59
1975M10 120.58  122.3
1975M11 121.26  123.35
1975M12 122.34  123.33

更新:これまでの回答は、xtsパッケージで%YM%mを使用するか、標準形式を取得する日を追加することにより、日付を正しく読み取る問題を解決します。目盛り軸のカスタマイズはまだ問題です。drawTimeAxisはディメンションエラーを出し、プロットコマンドは1年を超えるデータまたはその他の月次ラベルを表示しません。目盛り軸をカスタマイズする方法はありますか?

4

2 に答える 2

18

as.yearmon()次のことが私のために働くので、おそらくあなたは正しく使用していません( datGavinの答えから使用):

library(zoo)
dat$date <- as.yearmon(dat$date, "%YM%m")

したがって、物事を正しくプロットするために作業を進めます。

  1. あなたのデータ:

    dat <- read.table(text = "date    x   x2
    1975M1  112.44  113.12
    1975M2  113.1   114.36
    1975M3  115.04  114.81
    1975M4  117.65  115.35
    1975M5  119.5   116.92
    1975M6  121.4   118.56
    1975M7  120.64  118.97
    1975M8  119.12  119.84
    1975M9  118.91  120.59
    1975M10 120.58  122.3
    1975M11 121.26  123.35
    1975M12 122.34  123.33", header = TRUE)
    
  2. 「zoo」パッケージからのxts使用への変換。as.yearmon()

    library(xts) # Will also load zoo
    dat.xts <- xts(dat[-1], 
                   order.by = as.yearmon(dat$date, "%YM%m"))
    dat.xts
    #               x     x2
    # Jan 1975 112.44 113.12
    # Feb 1975 113.10 114.36
    # Mar 1975 115.04 114.81
    # Apr 1975 117.65 115.35
    # May 1975 119.50 116.92
    # Jun 1975 121.40 118.56
    # Jul 1975 120.64 118.97
    # Aug 1975 119.12 119.84
    # Sep 1975 118.91 120.59
    # Oct 1975 120.58 122.30
    # Nov 1975 121.26 123.35
    # Dec 1975 122.34 123.33
    
  3. データのプロット:

    plot.zoo(dat.xts)
    

    ここに画像の説明を入力してください

    plot.zoo(dat.xts, 
             plot.type="single", 
             col = c("red", "blue"))
    

    ここに画像の説明を入力してください

更新:独自の軸を指定する

使用するサンプルデータを次に示します(SOについて質問する場合は、他の人が問題を複製して対処しやすくなるため、通常、このようなサンプルデータを共有すると便利です)。この例では、実際には必要ないため、「xts」パッケージの使用をスキップしていることに注意してください。

set.seed(1)
dat <- data.frame(date = paste0(rep(1975:1977, each = 12), 
                                "M", rep(1:12, times = 3)),
                  x1 = runif(36, min = 100, max = 140),
                  x2 = runif(36, min = 100, max = 140))
library(zoo) # xts is actually unnecessary if this is all you're doing
# Convert your data to a `zoo` object
dat.z <- zoo(dat[-1], order.by = as.yearmon(dat$date, "%YM%m"))

これは、次のコマンドで取得されるデフォルトのプロットですplot(dat.z, screen = 1, col = 1:2)

ここに画像の説明を入力してください

あなたのコメントから、あなたは毎月のラベルのようなものが欲しいように思えます。

  1. データをプロットしますが、x軸を次のように抑制しますxaxt = "n"

    plot(dat.z, screen = 1, col = 1:2, xaxt = "n")
    
  2. 毎月のラベルを付けるために、いくつかのセットアップ作業を行います。(?plot.zooこれが変更された場所から、を参照してください。)

    tt <- time(dat.z)
    # The following is just the sequence 1:36. 
    #   If you wanted only every third month plotted,
    #   use a sequence like ix <- seq(1, length(tt), 3)
    ix <- seq_along(tt) 
    # What format do you want for your labels.
    #   This yields abbreviated month - abbreviated year
    fmt <- "%b-%y" 
    labs <- format(tt, fmt) # Generate the vector of your labels
    
  3. 軸をプロットに追加します。すべてに適切なサイズを見つけるには、いくつかの実験が必要になる場合があります。las = 2ラベルを軸に対して垂直にします。これは、毎年毎月のラベルを含める必要があると本当に感じた場合に必要です。

    axis(side = 1, at = tt[ix], labels = labs[ix], 
         tcl = -0.7, cex.axis = 0.7, las = 2)
    

最終的なプロットは次のとおりです。

ここに画像の説明を入力してください

ちなみに、などの日付を取得している場合は、この質問1977.15に対する回答のいくつかを読んでください。たとえば、@joranの。の使用法を確認してください。pretty()

于 2012-10-25T11:33:42.913 に答える
2

データの使用:

dat <- read.table(text = "date    x   x2
1975M1  112.44  113.12
1975M2  113.1   114.36
1975M3  115.04  114.81
1975M4  117.65  115.35
1975M5  119.5   116.92
1975M6  121.4   118.56
1975M7  120.64  118.97
1975M8  119.12  119.84
1975M9  118.91  120.59
1975M10 120.58  122.3
1975M11 121.26  123.35
1975M12 122.34  123.33", header = TRUE)

不足しているのは、日付をの有効な入力にするために、日付に日を追加する必要があるということですas.Date()"-01"このビットは、の各要素に追加することで実行できますdate"-"追加する新しい日から月を明確に区別するために、区切り文字を追加する必要があります。

paste0(as.character(date), "-01") ## temporary step, not needed

今、私たちは似たようなものを持っています

> with(dat, paste0(date, "-01"))  ## temporary step, not needed
 [1] "1975M1-01"  "1975M2-01"  "1975M3-01"  "1975M4-01"  "1975M5-01" 
 [6] "1975M6-01"  "1975M7-01"  "1975M8-01"  "1975M9-01"  "1975M10-01"
[11] "1975M11-01" "1975M12-01"

以下を使用できる適切な形式を書き出すことas.Date()ができます"%YM%m-%d"。ここでは"M"、日の部分の前にリテラルと区切り文字が含まれていることに注意してください"-"

これをまとめてtransform()、結果を挿入し直すと、次のようになりdatます。

## full solution
dat <- transform(dat, date = as.Date(paste0(date, "-01"), format = "%YM%m-%d"))

これは

> dat
         date      x     x2
1  1975-01-01 112.44 113.12
2  1975-02-01 113.10 114.36
3  1975-03-01 115.04 114.81
4  1975-04-01 117.65 115.35
5  1975-05-01 119.50 116.92
6  1975-06-01 121.40 118.56
7  1975-07-01 120.64 118.97
8  1975-08-01 119.12 119.84
9  1975-09-01 118.91 120.59
10 1975-10-01 120.58 122.30
11 1975-11-01 121.26 123.35
12 1975-12-01 122.34 123.33
于 2012-10-25T11:12:29.037 に答える