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.

Rプログラミング02 データ入出力編

808 views

Published on

主にデータの入出力について
(デモコードあり)

Published in: Education
  • Be the first to like this

Rプログラミング02 データ入出力編

  1. 1. 2015/10/24
  2. 2. 目 次 I. データの入力方法 A) コンソールでの直接入力 B) データエディタの利用 C) csvファイル [その1、その2] D) 固定長テキストファイル E) 複数のcsvファイルをまとめて II. 基本的な出力方法 A) ワークスペース全体の保存 B) コードの履歴の保存 C) バイナリファイル D) csvファイル 2 III. 関連知識  作業領域の掃除方法  ディレクトリやファイル の操作  ダブルクォーテーション  円記号  プログラミングの留意点  繰り返し処理  条件分岐  比較演算子  論理演算子  欠損値NAとその対処方法  NaN, Null, Inf
  3. 3. Ⅰ. データの入力方法
  4. 4. • 変数は、車のスピードと制動距離の二つ • それぞれspeedとdistという変数名を設定し、 「c()」の中に要素をカンマ区切りで並べて付置 することにより、ベクトルデータを作成し、次に dat1にそれぞれのベクトルをcbindで横に並べて 行列データを作成している A) コンソールでの直接入力 speed <- c(4, 4, 7, 7, …, 25) dist <- c(2, 10, 4, 22, …, 85) dat1 <- cbind(speed, dist) 4 例1. 車の制動距離データ [50×2] ※ 上のコマンドではデータを途中省略しているため、このスライドとセッ トでアップロードされているデモコードをご利用ください。
  5. 5. ちょっと脱線: Rで嬉しいこと plot(dat1) # 散布図描画 summary(dat1) # データの基本統計量表示 lm1 <- lm(dist~speed) # 回帰分析 summary(lm1) # 回帰分析結果表示 abline(lm1, col= "red") # 回帰線描画 データを入力すれば、散布図 を描き、回帰分析を行い、回 帰線を散布図に表示させる作 業がコマンド数行で終わる。 ※ lm関数の戻り値はリスト 5
  6. 6. • まずは空のデータフレーム dat2 を作成 • コンソールのメニューバーから「編集」 => 「データエ ディタ」を選ぶとデータエディタが起動するので、必要 なデータを入力する • メニューバー操作の代わりに fix 関数でも同じことがで きる • fix関数の代わりにedit 関数を使用する場合は付値が必要 B) データエディタの利用 dat2 <- data.frame() # 空のデータフレーム作成 fix(dat2) # データエディタの起動 6 ※ 行列の要素は全て同じ型のデータという制約があるが、 データフレームは列毎に型の違うデータを保持できる
  7. 7. • read.csv 関数は、csvを読み込むための関数 • File.choose 関数を使用することにより、ファイル選 択のダイアログボックスが開き、任意のファイルを指 定することができる • データは、cars.csv を使用する C) CSVファイル、その1 data1 <- read.csv(file.choose()) head(data1) # データの冒頭だけ表示 tail(data1) # データの末尾だけ表示 7 ※ データを読み込んだ後、内容確認はしておく。特に末尾を見る ことは大切。
  8. 8. • 大量データ処理にはダイアログボックスよりも、ファイ ル名を指定してcsvファイルを読む方が効率が良い • データは、cars2.csvを使用する C) CSVファイル、その2 setwd(“c:/Rdemo/”) # ファイルを置いたディレクトリを指定 dat3 <- read.csv("cars2.csv", header=TRUE) # データにヘッダがない場合はheader=FALSEを指定 head(dat3) # データの冒頭だけ表示 tail(dat3) # データの末尾だけ表示 8  cars.csvとcars2.csvのファイルの中身を、EXCEL で確認してみましょう  cars.csvとcars2.csvのファイルの中身を、テキス トエディタで確認してみましょう
  9. 9. • read.fwf 関数は、区切り文字のない固定長データを 読み込むための関数 • データは、cars.txt を使用する • ヘッダはない • 一行18桁で、10桁がスピード、8桁が距離で左詰め D) 固定長テキストファイル wt1 <- c(10, 8) # 桁数 cn1 <- c("speed", "dist") # 項目名 dat4 <- read.fwf("cars.txt", widths=wt1, col.names=cn1) head(dat4) # データの冒頭だけ表示 tail(dat4) # データの末尾だけ表示 9
  10. 10. E) 複数のCSVファイルをまとめて 最後に、より複雑な読込み処理に挑戦します E-1. 擬似ミクロデータについて E-2. ダウンロードファイル E-3. 圧縮ファイルの解凍 E-4. レイアウトと符号表 E-5. まず1本読んでみる E-6. 変数名の付与 E-7. もっと楽をしよう! E-8. まとめて
  11. 11. E-1. 擬似ミクロデータについて • 統計調査の集計表から、乱数を用いて再現した擬 似的な個別データ • (独)統計センターが平成16年全国消費実態調査に ついて作成し、HP上で無償にて試行提供中(申出 書の提出が必要) • 利用要件 申出者及び利用者以外の者に利用させないこと 集計表から擬似的に作成したデータであるので、 分析結果は実証研究の結果と見なすことができないこと を理解すること 利用者アンケートの提出 11
  12. 12. 平成16年全国消費実態調査 総務省統計局が5年毎に実施。 世帯を対象に、家計の収入・支出及び貯蓄・負 債、耐久消費財、住宅・宅地などの家計資産を 総合的に調査。 標本の大きさ 二人以上の世帯 約5万5千、単身世帯 約4千 疑似ミクロデータは二人以上の勤労者世帯 データ約3万2千件を収録。 調査の詳細は、 http://www.stat.go.jp/data/zensho/2004/index.htm 12
  13. 13. http://www.nstac.go.jp 13
  14. 14. 14 本日はこの7つのzip ファイルを使います E-2. ダウンロードファイル
  15. 15. 1.任意の作業フォルダA(例えば "c:/Rdemo")にファイルをダウ ンロードする 2.圧縮ファイルを解凍する 3.中のファイルを全て作業フォルダ (例えば"c:/Rdemo/giji")にコ ピーする 15 E-3. 圧縮ファイルの解凍
  16. 16. データファイルをエディタで表示すると 16 内容を理解するためには、 「データレイアウト」や 「符号表」が必要
  17. 17. 解凍した擬似ミクロデータファイル一覧 データレイアウトと符号表(Excelファイル) 17 データファイル(7分割のCSVファイル) F-4. レイアウトと符号表
  18. 18. • read.csv関数 GIJI_2004zensho_dataset(00001~05000).csv F-5. まず1本読んでみる setwd("c:/Rdemo/giji") giji1 <- read.csv("GIJI_2004zensho_dataset(00001 ~05000).csv", header=FALSE) head(giji1) tail(giji1) 変数名はV1, V2, … として自動で設定される 18
  19. 19. F-6. 変数名を付与するには 前スライドで作成したデータフレームgiji1 に、符号表にある変数名を新たに加える colnames(giji1) <- c("SetaiKubun", "SetaiJinin", "ShuugyouJinin", …, "Youto183") 変数名を予めデータファイルの一行目にセット しておき、これをヘッダとして再読み込み giji1 <- read.csv("GIJI_2004zensho_dataset(00001 ~05000).csv", header=TRUE) 19
  20. 20. F-7. もっと楽をしよう! • 既に変数名の電子データが、符号表として準 備されているので、これを利用する • 変数名は半角文字が使いやすいが、プロット 図等のラベルには漢字の変数名があると便利 • データが因子か数量かの区別もしておくと良 い dat1 <- read.csv("GIJI_2004zensho_dataset(00001 ~05000).csv", header=TRUE) 20
  21. 21. F-8. まとめて i. コンスタント作成(Excel作業) データレイアウト付属の符号表(Excelファイル)を 加工して、 擬似ミクロデータを R に変数名を付加させ ながら読み込ませるための情報ファイル(コンスタン ト)を作成 ii. コンスタント読込み ( R 作業) iii. データファイル読込み( R 作業) 作業フォルダから複数あるデータファイルの名前を取 得し、コンスタントを用いて、データファイルを連結 させながら読み込む 21
  22. 22. カンマ区切りの固定長データ => Rへの読み込みに必要なのは「変数名」と、各変 数が数量データであるかカテゴリデータであるかを示す「型」だけ。 何かの役に立つこともあるので、ここでは参照用に「行番号」と「階層」、表示用 に「項目名」も残してみた。 紫色で囲んだ行 (「変数名」のある行) を利用 22 符号表をExcelで表示すると こんな感じ
  23. 23. - EXCELでの作業手順 - 1. ヘッダより上の部分を削除 2. 「変数名」でソート、ブランク行削除 3. 「型」でソート、ブランクを2に書き換え 4. 「行番号」順に再ソート 5. 必要のない列を削除 6. ヘッダを半角文字に 7. CSVファイルとして保存[ここでは code.csv] 23 i. コンスタント作成 1 : 数量データ ブランク: カテゴリデータ Rに読み込むとブランクはNA に化けるので2に書き換える 型
  24. 24. ii. コンスタント読込み ~ EXCELで作ったCSVファイルの最後にはよくゴミがある~ 24 rm(list=ls(all=TRUE)) # 作業領域のお掃除♪ setwd("c:/Rdemo/giji/") # ファイルを置いたディレクトリの指定 Cd1 <- read.csv("code.csv", header=TRUE) Tail(cd1) A1 <- which(!is.na(cd1$ren)) # コンスタントファイル末尾の Cd1 <- cd1[a1,] # ブランク行削除 Tail(cd1) # cd1の末尾確認 no koumoku lvl type namae 192 517 土地家屋借金返済 4 1 Youto178 193 519 他の借金返済 4 1 Youto179 194 521 分割払・一括払購入借入金返済 4 1 Youto180 195 523 財産購入 4 1 Youto181 196 525 その他 4 1 Youto182 197 527 繰越金 3 1 Youto183 # 因子属性への変換抑制フラグ作成 ft1 <- rep(TRUE, dim(cd1)[1]) ft1[which(cd1$type == 2)] <- FALSEc
  25. 25. iii. データファイル読込み ~ 分割ファイルがたくさんあっても怖くない~ 25 # 命名規則を指定してデータファイル名の一覧を取得 (f.list <- list.files(path=getwd(), pattern="*).csv")) [1] "GIJI_2004zensho_dataset(00001~05000).csv" [2] "GIJI_2004zensho_dataset(05001~10000).csv" [3] "GIJI_2004zensho_dataset(10001~15000).csv" [4] "GIJI_2004zensho_dataset(15001~20000).csv" [5] "GIJI_2004zensho_dataset(20001~25000).csv" [6] "GIJI_2004zensho_dataset(25001~30000).csv" [7] "GIJI_2004zensho_dataset(30001~32027).csv" dt1 <- do.call("rbind", lapply(f.list, read.csv, col.names=cd1$namae, as.is=ft1, header=FALSE)) dim(dt1) [1] 32027 197
  26. 26. Ⅱ. 基本的な出力方法
  27. 27. A. 作業領域全体の保存 save.image()で作業領域にある全ての変数や関数を保存 することができる [拡張子は「.rdata」] setwd("c:/Rdemo/") # ファイルを作る場所を指定 save.image("Kensyuu1") メニューバーから「ファイル」⇒ 「作業スペースの保 存」 ⇒ ファイル名を指定する 27 ※ このとき保存されるものはls()で一覧表示される R終了時にダイアログボックス「作業スペースを保存しま すか?」が表示されるので「Yes」を選ぶ
  28. 28. 方法2 28
  29. 29. B. コード履歴の保存 29 • メニューバーか ら「ファイル」⇒ 「履歴の保存」で ファイル名選択の ダイアログが表示 される • 保存する履歴 コードファイルの 拡張子は「.r」
  30. 30. C. バイナリファイル • Aの方法で保存すると、バイナリファイルとなり 保存効率が高いが、作業領域全てを保存する場合、 必ずしも必要がない一時的なデータもわざわざ消 去しない限り含まれてしまい、サイズが大きくな りがち • 必要なデータだけを選んで保存することも可能 • 次の例は、擬似ミクロデータのデータレイアウ ト情報 cd1 とデータ dt1 を giji.rdata という ファイル名で保存するコマンド 30 save(cd1, dt1, file="giji.rdata")
  31. 31. D. CSVファイル 31 • 次の例は、Rに組込データとして収録されてい るあやめ(iris)の花のサイズに関するデータを 呼び出し、csvファイルに書き出すコマンド • 蕚(がく)片の長さと幅、課弁の長さと幅、あや めの品種の5変数を持つ data(iris) # 5変数150レコードのあやめデータ write.csv(iris, file="iris.csv", header=TRUE)
  32. 32. Ⅲ. 関連知識
  33. 33. ■ 作業領域の掃除方法 • 作業領域にある全オブジェクト一覧 ls() • 全オブジェクトを消去 rm(list=ls()) • オブジェクト x1, x2 を消去 rm(x1, x2) • 関数オブジェクト以外の全てのオブジェクトを消 去 rm(list=ls()[!sapply(ls(), FUN=exists, mode="function")]) 33
  34. 34. ■ ファイルやディレクトリの操作 • 現在のディレクトリを取得 getwd() • ファイル一覧取得 list.files() • ディレクトリ変更 setwd("mydirectory") • ディレクトリを作成 dir.create("mydirectory") • ファイルの削除 file.remove ("myfile") 34
  35. 35. ダブルクォーテーション ファイル名や色名、文字列などの指定はダブ ルクォーテーションで囲んで指定するが、その ダブルクォーテーションは半角でなければなら ない plot(dat1) # 散布図描画 abline(lm1, col= “red”) # 全角 abline(lm1, col= "red") # 半角 Wordやパワーポイントは勝手に半角のダブルクォーテーション を全角に変えてしまう。Rのコードがうまく動かないときは、要 チェック!
  36. 36. 円記号[] Windowsでディレクトリのパス指定に使 われる円記号は、二重[]にするか、あるい はスラッシュ[/]に置き換える setwd("e:/R研修") setwd("c:") Windowsでの問題
  37. 37.  Rプログラミングの留意点 • 思考をそのままコードに落とせる自由度の高い プログラミング言語だが、それを逆に考えれば、 人のコードは読み難い。メンテも困難。 • コーディング後一ヶ月も経過すれば、自分の コードすらわからなくなることもある。 • 他人に読ませたりメンテを引継ぐ必要のある コードは、特に可読性を意識して書くこと。 • 一ヵ月後の自分のために、きめ細かく#を頭につ けてコメントを書き込む習慣をつける。 • Rはコード中の空白や改行は無視する • 一連の処理を複数行に改行し、それぞれの行にコ メントを付けることも可能 37
  38. 38. i <- 5 while (i > 0){ print("Hello!") i <- i - 1 } 繰り返し処理 • for • while 38 for (i in 1:5) print("Hello") nm1 <- c("Mio", "Ryo", "John", “Yuki", "Taro") for (i in 1:5) { print(paste("Hello, ", nm1[i], "!", sep="") ) }
  39. 39. 条件分岐 • if() else{} • ifelse 3 9 b <- c <- 0 if (a > 0) { b <- b + 1; print("a > 0") } else { c <- c + 1; print ("a <= 0") } outcome <- ifelse (score > 0.5, print("Passed"), print("Failed"))
  40. 40. 比較演算子 比較演算子 記号 意味 == 等しい != 等しくない >= 以上(≥) > より大きい <= 以下(≤) < より小さい 40
  41. 41. 論理演算子 記号 意味 要素の種類 ! NOT(ではない) 値、ベクトル && AND(かつ) 値 || OR(または) 値 & AND(かつ) ベクトル | OR(または) ベクトル 41
  42. 42. 欠損値 NA(1) 42 > x1 <- c(1,,5,2,4) 以下にエラー c(1, , 5, 2, 4) : 引数 2 が空です > x1 エラー: オブジェクト 'x1' がありません > x1 <- c(1,NA,5,2,4) > x1 [1] 1 NA 5 2 4 > x1 == 5 [1] FALSE NA TRUE FALSE FALSE > which(x1 == 5) # x1の値が5であるデータ番号 [1] 3 >
  43. 43. 欠損値 NA(2) 43 > which(x1 == NA) # x1の値がNAであるデータ番号 integer(0) # ????? > x1 == NA [1] NA NA NA NA NA NAに対する演算結果は全てNAで比較演算子 ==も使えない 代わりに、is.na という特別な関数が用意されているみち
  44. 44. 関数 is.na() 44 > which(x1 == NA) #x1の値がNAであるデータ番号 integer(0) # 1つもない > x1 == NA [1] NA NA NA NA NA > sum(x1) [1] NA NAに対する演算結果は全てNAで比較演算子 ==も使えず、そのままでは合計も計算できない 代わりに、is.na という特別な関数が用意されているみち
  45. 45. NAへの対応方法 45 > x1[!is.na(x1)]# NAを単に除去 [1] 1 5 2 4 > sum(x1[!is.na(x1)]) # 除去後合計を計算 [1] 12 > x2 <- ifelse(is.na(x1), 0, x1) # 0に置き換 え > sum(x2) [1] 12 > x2 [1] 1 0 5 2 4
  46. 46. NaN, Null, Inf • NaN: 非数。例えば0を0で割ると得られる。 • Null: なにもないことを示す。NAが欠測を示す のに対し、Nullはなにもないことを示し、ベクト ルや行列といった構造を持つことはできない。 • Inf, -Inf: 無限大。例えば5を0で割ると得られる。 46 検査のための関数 機能 is.nan() 非数かどうか is.null() NULLかどうか is.finite() 有限かどうか is.infinite() 無限大かどうか

×