Más contenido relacionado La actualidad más candente (20) Similar a 統計環境R_データ入出力編2016 (20) 統計環境R_データ入出力編20162. 目 次
I. データの入力方法
A) コンソールでの直接入力
B) データエディタの利用
C) csvファイル [その1、その2]
D) 固定長テキストファイル
E) 複数のcsvファイルをまとめて
II. 基本的な出力方法
A) ワークスペース全体の保存
B) コードの履歴の保存
C) バイナリファイル
D) csvファイル
2
III. 関連知識
作業領域の掃除方法
ディレクトリやファイル
の操作
ダブルクォーテーション
円記号
プログラミングの留意点
繰り返し処理
条件分岐
比較演算子
論理演算子
欠損値NAとその対処方法
NaN, Null, Inf演習用コードファイル:
Rデモ02_入出力編.r
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]
※ 上のコマンドではデータを途中省略しているため、このスライドに対応している
デモコードファイル「Rデモ02_入出力編.r」を参照してください
5. ちょっと脱線: Rがお勧めな理由
plot(dat1) # 散布図描画
summary(dat1) # データの基本統計量表示
lm1 <- lm(dist~speed) # 回帰分析
summary(lm1) # 回帰分析結果表示
abline(lm1, col= "red") # 回帰線描画
データを入力すれば、散布図
を描き、回帰分析を行い、回
帰線を散布図に表示させる作
業がコマンド数行で終わる。
※ lm関数の戻り値はリスト
5
6. • まずは空のデータフレーム dat2 を作成
• コンソールのメニューバーから「編集」 => 「データエ
ディタ」を選ぶとデータエディタが起動するので、必要
なデータを入力する
• メニューバー操作の代わりに fix 関数でも同じことがで
きる
• fix関数の代わりにedit 関数を使用する場合は付値が必要
B) データエディタの利用
dat2 <- data.frame() # 空のデータフレーム作成
fix(dat2) # データエディタの起動
6
※ 行列の要素は全て同じ型のデータという制約があるが、
データフレームは列毎に型の違うデータを保持できる
7. • read.csv 関数は、表形式のcsvを読み込むための関数
• File.choose 関数を使用することにより、ファイル選
択のダイアログボックスが開き、任意のファイルを指
定することができる
• データは、cars.csv を使用する
(cars.csvは、Rの組込みデータcarsをcsvファイルにしたもの)
C) CSVファイル、その1
data1 <- read.csv(file.choose())
head(data1) # データの冒頭だけ表示
tail(data1) # データの末尾だけ表示
7
※ データを読み込んだ後、内容確認をしておく。特に末尾は空レ
コードなどが入る場合があるので、必ずチェックする。
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のファイルの中身を、テキス
トエディタで確認してみよう!
csvデータの内容確認は、EXCELではなくテキスト
エディタで!
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
17. hd1 <- read.csv("GIJI_2004zensho_vname.csv",
header=FALSE) # hd1はデータフレームになる
colnames(giji1) <- as.vector(hd1[,1])
E-5. 変数名を付与するには
変数名ファイルGIJI_2004zensho_vname.csvが容易
されているので、それを使ってgiji1に変数名を付与
任意の変数名を予めデータファイルの一行目にセッ
トしておき、ヘッダつきファイルとして再読み込み
giji1 <- read.csv("GIJI_2004zensho_dataset(00001
~05000).csv", header=TRUE)
17
20. - EXCELでの作業手順 -
1. ヘッダより上の行を削除
2. 「変数名」で並べ替え、ブランク行削除
3. 「型」で並べ替え、ブランクを2に書き換え
4. 「行番号」順に並べ替え
5. 必要のない列を削除
6. ヘッダを半角文字に
7. CSVファイルとして保存[ここでは code.csv]
20
i. コンスタント作成
1 : 数量データ
ブランク: カテゴリデータ
Rに読み込むとブランクはNA
に化けるので2に書き換える
型
ヘッダ
21. ii. コンスタント読込み
~ EXCELで作ったCSVファイルの最後にはよくゴミが残る~
21
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)] <- FALSE
22. iii. データファイル読込み
~ 分割ファイルがたくさんあっても怖くない~
22
# 命名規則を指定してデータファイル名の一覧を取得
(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
30. ■ 作業領域の掃除方法
• 作業領域にある全オブジェクト一覧
ls()
• 全オブジェクトを消去
rm(list=ls())
• オブジェクト x1, x2 を消去
rm(x1, x2)
• 関数オブジェクト以外の全てのオブジェクトを消
去
rm(list=ls()[!sapply(ls(), FUN=exists,
mode="function")])
30
35. i <- 5
while (i > 0){
print("Hello!")
i <- i - 1
}
繰り返し処理
• for
• while
35
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="") )
}
36. 条件分岐
• if() else{}
• ifelse
36
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"))
38. 論理演算子
記号 意味 要素の種類
! NOT(ではない) 値、ベクトル
&& AND(かつ) 値
|| OR(または) 値
& AND(かつ) ベクトル
| OR(または) ベクトル
38
39. 欠損値 NA(1)
> 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
>
39
40. 欠損値 NA(2)
40
> which(x1 == NA) # x1の値がNAであるデータ番号
integer(0) # ?????
> x1 == NA
[1] NA NA NA NA NA
NAに対する演算結果は全てNAで比較演算子
==も使えない
代わりに、is.na という特別な関数が用意されているみち
41. 関数 is.na()
41
> which(x1 == NA) #x1の値がNAであるデータ番号
integer(0) # 1つもない
> x1 == NA
[1] NA NA NA NA NA
> sum(x1)
[1] NA
NAに対する演算結果は全てNAで比較演算子
==も使えず、そのままでは合計も計算できない
代わりに、is.na という特別な関数が用意されているみち
43. NaN, Null, Inf
• NaN: 非数。例えば0を0で割ると得られる。
• Null: なにもないことを示す。NAが欠測を示す
のに対し、Nullはなにもないことを示し、ベクト
ルや行列といった構造を持つことはできない。
• Inf, -Inf: 無限大。例えば5を0で割ると得られる。
43
検査のための関数 機能
is.nan() 非数かどうか
is.null() NULLかどうか
is.finite() 有限かどうか
is.infinite() 無限大かどうか
Notas del editor class(lm1) class関数で各ベクトルの属性を確認できる
# dat2 <- edit(dat2) # 上のコマンドと同じ
class関数で各ベクトルの属性を確認できる class関数で各ベクトルの属性を確認できる class関数で各ベクトルの属性を確認できる 匿名データとデータのつくりが同じ。
実際の匿名データよりは小さいが、レコード数約3万2千、197項目という大規模データなので、マイニングなどにも。
試行提供段階なのでご意見をいただきたい。
連番があるので、ソートしてももとに戻せるのがポイント!
「型」には1かブランクが入っているが、使いやすいようにブランクを2に置き換える。 メモリ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)
}
テキストエディタを使用している限りは問題が起きないが、WordなどOffice系のソフト上でコマンドを書く場合、半角のダブルクォーテーション(Shift-JISの16進コードで”22”)を勝手に全角(“8167”と”8168”)に変換することがある。
そのままプロンプトの画面にコピーペストしても適正には動かない。 Rで採用されている正規表現では、\に続く文字に特殊な意味を持たせているため。 http://qiita.com/uri/items/1245441ab179c6ee76f9 http://qiita.com/uri/items/1245441ab179c6ee76f9