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

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

Editor's Notes

  • #6 class(lm1)
  • #7 class関数で各ベクトルの属性を確認できる # dat2 <- edit(dat2) # 上のコマンドと同じ
  • #8 class関数で各ベクトルの属性を確認できる
  • #9 class関数で各ベクトルの属性を確認できる
  • #10 class関数で各ベクトルの属性を確認できる
  • #12 匿名データとデータのつくりが同じ。 実際の匿名データよりは小さいが、レコード数約3万2千、197項目という大規模データなので、マイニングなどにも。 試行提供段階なのでご意見をいただきたい。
  • #24 「型」には1かブランクが入っているが、使いやすいようにブランクを2に置き換える。
  • #26 メモリ2GBの32bitのVista機で実行。このくらいのデータ量であれば一気読みしても問題はない。 旧コード #カレントディレクトリから特定の命名規則に従うデータファイル名の一覧を取得 (f.list <- list.files(path=getwd(), pattern="*).csv")) n.file <- length(f.list) # データファイルの数をカウント # データの読込 dt2 <- read.csv(f.list[1], col.names=cd1$namae, as.is=ft1, header=FALSE) for (i in 2:n.file){ # ファイルの数だけループ d1 <- read.csv(f.list[i], col.names=cd1$namae, as.is=ft1, header=FALSE) dt2 <- rbind(dt2, d1) }
  • #36 テキストエディタを使用している限りは問題が起きないが、WordなどOffice系のソフト上でコマンドを書く場合、半角のダブルクォーテーション(Shift-JISの16進コードで”22”)を勝手に全角(“8167”と”8168”)に変換することがある。 そのままプロンプトの画面にコピーペストしても適正には動かない。
  • #37 Rで採用されている正規表現では、\に続く文字に特殊な意味を持たせているため。
  • #41 http://qiita.com/uri/items/1245441ab179c6ee76f9
  • #42 http://qiita.com/uri/items/1245441ab179c6ee76f9