質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

2回答

7382閲覧

R 折れ線グラフを書くためのデータフレームの成型について

退会済みユーザー

退会済みユーザー

総合スコア0

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

1クリップ

投稿2017/08/01 02:10

以下のサンプルフレームをコチラからお借りします。
http://d.hatena.ne.jp/teramonagi/20100930/1285806175)

x <- read.zoo(read.csv(file.currency.rate))
as.xts(x,order.by=index(x)+1)

USDJPY EURJPY AUDJPY

2010-07-28 85.17 115.83 75.43
2010-07-29 88.06 113.62 77.70
2010-07-30 84.63 112.44 80.37
2010-08-02 85.99 116.35 77.67
2010-08-03 86.41 110.96 78.06
2010-08-04 84.84 113.34 76.80
2010-08-05 84.56 113.97 77.19
2010-08-06 86.24 115.62 77.16
2010-08-09 85.42 114.04 78.51

のようなデータフレームから、
一か月分の推移折れ線グラフを作成したいというのが最終目的なのですが、

まず期間を指定して抽出したかったので、データフレームをxts型に変換したのですが、
xts型にすると、グラフ化する際に、日付が出力されませんよね。

日付を付けて出力したかったので、一旦as.data.frame()で上記サンプルフレームを
変換しても、日付軸のヘッダーを追加することが
names(x) <- c("date", "USDJPY","EURJPY","AUDJPY")
などでもできず、列数が足りない(日付軸がカウントされていない)と怒られます。
そのため、
ggplot(x,aes(x=
の所でX軸にしたい日付軸を選択できなくて、
色々ネットや本で見てみてはいるのですが、かゆい所に手が届く記載を見つけることができず、
小さい事ですが時間を要しています。。

目盛のためのグラフ用x軸データを別途作成して、グラフにaxisで付加したりもしてみたのですが、
グラフのx軸に、そのままデータフレームの日付を使う方法が知りたいです。

どなたかご教授頂けないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

as.data.frame したときに列数が足りないのは,日付は行名として保存されているからです.
なので,これを取り出して列として追加してやればよいです.
簡単にやるには,tibble パッケージの rownames_to_column() でできます.

data.frame にしてからプロットしたものを載せていますが,出来上がったグラフはxtsのままプロットしたもの(ggplot(x,aes(x=Index,y=USDJPY))+geom_line()) と同じでした.

r

1library(zoo) 2library(xts) 3library(dplyr) 4library(ggplot2) 5x <- read.zoo(read.csv("file.currency.rate")) 6x.xts <- as.xts(x) 7x.xts 8#> USDJPY EURJPY AUDJPY 9#> 2010-07-28 85.17 115.83 75.43 10#> 2010-07-29 88.06 113.62 77.70 11#> 2010-07-30 84.63 112.44 80.37 12#> 2010-08-02 85.99 116.35 77.67 13#> 2010-08-03 86.41 110.96 78.06 14#> 2010-08-04 84.84 113.34 76.80 15#> 2010-08-05 84.56 113.97 77.19 16#> 2010-08-06 86.24 115.62 77.16 17#> 2010-08-09 85.42 114.04 78.51 18str(x.xts) 19#> An 'xts' object on 2010-07-28/2010-08-09 containing: 20#> Data: num [1:9, 1:3] 85.2 88.1 84.6 86 86.4 ... 21#> - attr(*, "dimnames")=List of 2 22#> ..$ : NULL 23#> ..$ : chr [1:3] "USDJPY" "EURJPY" "AUDJPY" 24#> Indexed by objects of class: [Date] TZ: UTC 25#> xts Attributes: 26#> NULL 27class(x.xts) 28#> [1] "xts" "zoo" 29 30# xts のままプロット 31# ggplot(x.xts, aes(Index, USDJPY)) + geom_line() 32 33# data.frame でプロット 34# as.data.frame(x.xts) でも同じ 35x.df <- as.data.frame(x) %>% 36 tibble::rownames_to_column(var = "Date") %>% 37 mutate(Date = as.Date(Date)) 38ggplot(x.df, aes(Date, USDJPY)) + geom_line()

plot

投稿2017/08/01 04:25

編集2017/08/01 05:03
what_alnk

総合スコア147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/01 04:36

「列数が足りないのは,日付は行名として保存されているから」 ということなんですね。。 x.df <- as.data.frame(x) %>% tibble::rownames_to_column(var = "Date") %>% mutate(Date = as.Date(Date)) ここが知りたかったです!!できました!!!ありがとうございます!!
退会済みユーザー

退会済みユーザー

2017/08/01 05:21

すみません、もうひとつ質問させて頂いてもよいですか?? もし、日付の欄に 2010-07-28 0:00 2010-07-28 1:00 2010-07-28 2:00  ¦ 2010-08-03 23:00 のように、時刻まで入っていたら、最後の「mutate(Date = as.Date(Date))」の所、 どのように書き換えたら、同じように列として追加できるのでしょうか。 伺ってばかりで申し訳ありません。もしお時間許せば、御教授頂けますでしょうか。
what_alnk

2017/08/01 10:55

まず,ファイル読み込みのときに,`read.zoo(read.csv(file.currency.rate), FUN2 = as.POSIXct)` というふうにして Date ではなく POSIXct で読み込みます.で,`data.frame` に変換するときに `mutate(Date = as.POSIXct(Date))` とすればいいはずです.
退会済みユーザー

退会済みユーザー

2017/08/02 00:50

ファイル読み込む所から別処理をしなければならないのですね・・・! ありがとうございます、やってみます!
guest

0

aesの指定でx=Indexとすれば出るはず.

ちなみに,簡単なものでいいならautoplot使う方が早いですよ.

投稿2017/08/01 02:32

tamy

総合スコア442

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/01 03:01

> ggplot(x,aes(x=Index,y=USDJPY))+geom_line() としてみましたが、グラフは作成されたものの、一本の折れ線グラフとなるはずという意図とは 違う無数の折れ線グラフが作成されました。。たしかに日付は表示されましたが、、 なぜうまくいかない(涙) ただのplot()で記載するならば、x$のあとに列名がないので選択できないですが、この際の方法はあるのでしょうか?? 色々と伺ってすみません・・・
tamy

2017/08/01 03:19

あれ?手元では一本しか出ないのですが… plotを使う場合でも,手元の環境では plot(x$USDJPY) とすると自動でx軸に日付を入れてくれますね…
退会済みユーザー

退会済みユーザー

2017/08/01 04:19

plotを使う場合でも,手元の環境では plot(x$USDJPY) とすると自動でx軸に日付を入れてくれます ⇒試していただいてありがとうございます。ちなみに、このxは、xts型にされていますでしょうか。 xts型だと、うまくいかないように感じるのですが、、
tamy

2017/08/01 04:23

参照しているサイトと同じで,class(x) => "xts" "zoo" になります
退会済みユーザー

退会済みユーザー

2017/08/01 04:38

一緒に考えて下さってありがとうございます。なんとかできました!! 貴重なお時間を割いて頂いて申し訳ありません。たすかりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問