Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

for関数を使った繰り返し処理によるヒストグラムの一括出力

4,983 views

Published on

15.7.11 HiRoshima.R #4 Lightning Talks
@imyuaotiの発表資料です。

※注意※(2015.7.19追記)
Rでは処理速度が遅いという理由で
for関数の使用は避けるべきと考えられています。

本来は,処理を高速化をしたい場合,以下をうまく活用してください。

・apply関数
・foreachパッケージ,pforeachパッケージ


【参考資料】
「勝手に添削:for関数を使った繰り返し処理によるヒストグラムの一括出力 #rstatsj」
http://qiita.com/hoxo_m/items/5127c31f3eafd6be7428
(hoxo_mさんに本スライドの内容を添削してもらいました!)

「for を捨てよ、foreach を書こう」
http://www.slideshare.net/hoxo_m/for-foreach

「R で超簡単に並列処理を書けるpforeach パッケージ」
http://www.slideshare.net/hoxo_m/pforeach



--------------
@imuyaotiはR初心者です!まだまだ勉強不足です!

Published in: Data & Analytics
  • ※注意※をよんでくださいね!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

for関数を使った繰り返し処理によるヒストグラムの一括出力

  1. 1. HiRoshima.R #4 2015.7.11 伊藤 歩 for関数を使った繰り返し処理による ヒストグラムの一括出力
  2. 2. ヒストグラムといいつつ 棒グラフも描きますっ 2
  3. 3. やりたいこと データに含まれるすべての変数の 分布をグラフ化したい! 4 離散変数:縦軸に頻度をとった棒グラフ 連続変数:ヒストグラム
  4. 4. 悩み 変数の多いデータだと同じプログラムを 繰り返し書くことになり… 5 まだまだ続く ・ ・ ・  めんどくさい  行数がすごいことに  途中で間違いに気づいたら 心が折れる
  5. 5. 本日の目標 データに含まれるすべての変数の分布を 繰り返し関数forをつかって より短いプログラムで楽にグラフ化する! 6
  6. 6. 本日の内容 2つの ポイント 1.オブジェクトのクラス 2.変数・要素の呼び出し 4つの 手順 3.plotとhist 4.forで一括出力 7 1.クラスの変換 2.データの分割 for関数を使った繰り返し処理による ヒストグラムの一括出力
  7. 7. 本日の内容 2つの ポイント 1.オブジェクトのクラス 2.変数・要素の呼び出し 8
  8. 8. ポイント1|オブジェクトのクラス 9 データセットの中には様々な種類の変数が混在している 間隔 順序 比率 名義 量的 質的 連続 離散 Rの世界では変数の種類はどのように扱われるのか?
  9. 9. ポイント1|オブジェクトのクラス 文字クラス: character “ ”で囲われた文字データ 数値クラス: numeric 数値データ 整数クラス: integer 数値データのうち整数のデータ 因子クラス: factor (ordered factor) みかけは文字クラスや整数クラス 実態は1,2,3…の数値が入っている! (factorに順序がついたもの) 10 例)sex:Factor w/2 levels “男”,“女”:1,2,2,1,… 論理クラス(logical):TRUE or FALSE もある オブジェクト(変数)にはクラスが定義されている
  10. 10. character numeric integer factor hist plot ポイント1|オブジェクトのクラス 11 クラスによって関数の出力形式が異なる 棒グラフ ヒストグラム 散布図
  11. 11. ポイント1|オブジェクトのクラス 12 plot factor numeric integer factorcharacter plothist クラスにごとにグラフ出力関数を選ぶ!
  12. 12. 本日の内容 2つの ポイント 1.オブジェクトのクラス 2.変数・要素の呼び出し 13
  13. 13. ポイント2|変数・要素の呼び出し 変数・要素は列番号・要素番号で呼び出す 14 head(iris$Sepal.Length) # データフレーム名$列名 [1] 5.1 4.9 4.7 4.6 5.0 5.4 head(iris[,1]) # データフレーム名[,列番号] [1] 5.1 4.9 4.7 4.6 5.0 5.4 for関数でループさせるリストとして扱いやすい! head( データフレーム ):データフレームの上から6行を取り出す
  14. 14. 2つのポイントのまとめ 15 1.クラスごとに適切なグラフ出力関数を選ぶ 2. for関数使うとき列や要素は番号でよびだす character → factor :plot...棒グラフ numeric・integer :hist...ヒストグラム factor :plot...棒グラフ データフレーム[,列番号] ベクトル[, 要素番号]
  15. 15. では,サンプルデータを操作しながら 4つの手順を説明していきます。 16
  16. 16. 本日のデータセット irisデータにv1,v2,v3を追加 v1:ordered factor…1<2<3<4 v2:character…A,B,C v3:character…地区1~地区5 17 dat <- iris v1 <- ordered(c(rep(1, length=40), rep(2, length=55), rep(3, length=30), rep(4, length=25))) v2 <- c(rep("A", length=45), rep("B", length=65), rep("C", length=40)) v3 <- c(rep("地区1", length=25), rep("地区2", length=25), rep(“地区3”, length=15), rep("地区4", length=50), rep("地区5", length=35)) dat <- cbind(dat, v1, v2, v3) dat[,7] <- as.character(dat[,7]) dat[,8] <- as.character(dat[,8]) (irisに含まれていないクラスをもつ)
  17. 17. 本日のデータセット 18 head(dat) Sepal.Length Sepal.Width Petal.Length Petal.Width Species v1 v2 v3 1 5.1 3.5 1.4 0.2 setosa 1 A 地区1 2 4.9 3.0 1.4 0.2 setosa 1 A 地区1 3 4.7 3.2 1.3 0.2 setosa 1 A 地区1 4 4.6 3.1 1.5 0.2 setosa 1 A 地区1 5 5.0 3.6 1.4 0.2 setosa 1 A 地区1 6 5.4 3.9 1.7 0.4 setosa 1 A 地区1 ① ③ ④ ⑤ ⑥⑦ ⑧② 8つの変数を含むデータフレーム dat を作成
  18. 18. integer 型は今回の説明に含めませんが numeric 型と同様に扱えます! 19
  19. 19. 4つの手順 20 3.plotとhist 4.forを使って一括出力 1.クラスの変換 2.データの分割 character factor factor numeric numeric factor numeric factor numeric plot hist factor factor numeric numeric numeric factor factor numeric numeric for {plot} for {hist} factor numeric
  20. 20. 4つの手順 21 3.plotとhist 4.forを使って一括出力 2.データの分割 factor numeric numeric factor factor numeric plot hist factor factor numeric numeric for {plot} for {hist} factor numeric 1.クラスの変換 character factor numeric numeric factor factor numeric numeric データに含まれるcharacter型の変数を 探してfactor型に変換する
  21. 21. 手順 1|クラスの変換 datの各変数のクラスを確認 22 sapply(dat, class) $Sepal.Length [1] "numeric" $Sepal.Width [1] "numeric" $Petal.Length [1] "numeric" $Petal.Width [1] "numeric“ $Species [1] "factor" $v1 [1] "ordered" "factor" $v2 [1] "character" $v3 [1] "character" class( オブジェクト):オブジェクトのクラスを呼び出す sapply( データフレーム, 関数):関数をデータフレームの列ごとに適用する ⑦ ⑧
  22. 22. 手順 1|クラスの変換 character型をfactor型に変換 23 dat[,7] <- as.factor(dat[,7]) # datの7,8列目を変換 dat[,8] <- as.factor(dat[,8]) class(dat[,7]) # 変換できたか確認 [1] “factor" as.factor( オブジェクト ):オブジェクトのクラスをfactor型に変換する [1] “factor" class(dat[,8]) OK! OK!
  23. 23. 4つの手順 24 3.plotとhist 4.forを使って一括出力 1.クラスの変換 character factor numeric factor numeric plot hist numeric factor factor numeric numeric for {plot} for {hist} factor numeric 2.データの分割 factor numeric numeric factor factor factor numeric numeric データフレームをfactor型かnumeric型のみ 含むデータフレームに分割する
  24. 24. colf <- grep("factor", sapply(dat, class)) colf 手順 2|データの分割 factor型の入っている列を探す 25 [1] 5 6 7 8 # “factor” が入っているのは5,6,7,8番目の列だよ! grep( “検索したい文字列”, 検索対象 ): 検索対象の中から検索したい文字列が何番目に入っているか探す $Sepal.Length [1] "numeric" $Sepal.Width [1] "numeric" $Petal.Length [1] "numeric" $Petal.Width [1] "numeric“ $Species [1] "factor" $v1 [1] "ordered" "factor" $v2 [1] "factor“ $v3 [1] "factor" ① ③ ④ ⑤ ⑥ ⑦ ⑧ ② 中は...
  25. 25. 手順 2|データの分割 データをnumeric型とfactor型に分割する 26 datn <- dat[,-c(colf)] # datからfactorの列を除く datf <- dat[,c(colf)] # datからfactorの列を選ぶ head(datn) head(datf) Sepal.Length Sepal.Width Petal.Length Petal.Width 1 5.1 3.5 1.4 0.2 2 4.9 3.0 1.4 0.2 3 4.7 3.2 1.3 0.2 4 4.6 3.1 1.5 0.2 5 5.0 3.6 1.4 0.2 6 5.4 3.9 1.7 0.4 Species v1 v2 v3 1 setosa 1 A 地区1 2 setosa 1 A 地区1 3 setosa 1 A 地区1 4 setosa 1 A 地区1 5 setosa 1 A 地区1 6 setosa 1 A 地区1
  26. 26. 4つの手順 27 4.forを使って一括出力 1.クラスの変換 2.データの分割 character factor factor numeric numeric factor numeric factor factor numeric numeric numeric factor factor numeric numeric for {plot} for {hist} factor numeric 3.plotとhist factor numeric plot hist factor型はplot,numeric型はhistで それぞれグラフ出力するプログラムをかく
  27. 27. 手順 3| plotとhist 28 plot(datf[,列番号], main = colnames(datf)[列番号], # グラフタイトル cex.main = 3, # グラフタイトルの文字サイズ col = “black”, # バーの色 space = 0.3) # バーの間隔 before after colnames( データフレーム ):データフレームの列名を取り出す factor
  28. 28. 手順 3| plotとhist 29 hist(datn[,列番号], main = colnames(datn)[列番号], cex.main = 3, xlab = NULL, # x軸ラベル ylab = NULL, # y軸ラベル breaks = 20, # 階級の分割数 # デフォルトはスタージェスの公式 # “Scott”でスコットの選択 col = “grey”) # ヒストグラムの色 before after numeric
  29. 29. 4つの手順 30 3.plotとhist 1.クラスの変換 2.データの分割 character factor factor numeric numeric factor numeric factor numeric plot hist factor factor numeric numeric numeric factor factor numeric numeric 4.forを使って一括出力 for {plot} for {hist} factor numeric 作成したプログラムを for関数の中に組み込んでグラフを出力する
  30. 30. 手順 4| forを使って一括出力 for関数の使い方 31 for ( i in 1:ncol(datf)){ plot(datf[, i ]) } for ( ループ変数 in リスト ){ 繰り返したい処理 } ループ変数 リスト ncol( データフレーム ):データフレームの列数を出力する リストの中身:( 1, 2, 3, 4 )
  31. 31. 手順 4| forを使って一括出力 foctor型の棒グラフを一括出力 32 for(i in 1:ncol(datf)){ plot(datf[, i ], main = colnames(datf)[ i ], col = “black”, space = 0.3, cex.main = 3) }
  32. 32. 手順 4| forを使って一括出力 numeric型のヒストグラムを一括出力 33 for(i in 1:ncol(datn)){ hist(datn[, i ], main = colnames(datn)[ i ], cex.main = 3, xlab = NULL, ylab = NULL, breaks = 20, col = “grey”) }
  33. 33. ついでに 手順1のas.factorによる characer型のfactor型への変換も for関数で繰り返せば楽々&短縮 34 colc <- grep("character", sapply(dat,class)) for(i in 1:length(colc)){ dat[,colc[i]] <- as.factor(dat[,colc[i]]) }
  34. 34. こんなに短く! 35 61行 25行 変数が多いほど短くなる!楽になる!
  35. 35. 参考にさせていただきました オブジェクトクラスについて 生態学のデータ解析 - R-primer/R 基本データクラス http://hosho.ees.hokudai.ac.jp/~kubo/ce/RdataType0.html データフレームの分割について scratch-R データの選択・除外・抽出etc http://eau.uijin.com/management/subset.html グラフ出力について biostatistics グラフィックス http://stat.biopapyrus.net/graph/hist.html 全体的に R-Tips RjpWiki - RjpWiki 改訂2版 R言語逆引きハンドブック R関連のslide share などなど 36

×