ずっとやらずに放置してきたR言語だったけど、ようやく先週からcourseraのR Programmingという授業を始めてみた。
コースのWeek1のメモ。
Rの型
基本の型
文字列 character
実数 number
整数 integer
複素数 complex
真偽値 logical (= boolean)
- ベクトル値(≒ 同型の配列):
vector()
実数(number)
- 末尾にLをつけると 整数(integer)になる
x <- 1
x <- 1L
- 無限を表すInf
- 未定義値のNaN
属性
attribute()
関数- names, dimnames
- dimensions
- class / length / other
ベクトル値
- 同じ型の配列
c()
関数で値から作成可能(concatenate)
> x <- c("a", "b", "c")
> x
[1] "a" "b" "c"
vector()
関数で定義作成可能
> x <- vector("numeric", length = 10)
> x
[1] 0 0 0 0 0 0 0 0 0 0
- 違う型のものを混ぜると優先度に従って自動で型の統一が起こる
- 文字列 > 数値 > 真偽値
as.xxx()
によって型キャストが可能。破綻するものはNAとして表される
> as.numeric(x)
> as.logical(x)
> as.character(x)
リスト
- 異なる型を格納可能な特別なベクトル
マトリックス(行列)
matrix()
関数で定義可能
> m <- matrix(nrow = 2, ncol = 3)
dim()
で行列の定義を確認できる(attributes() で見ると dim属性が設定されていることが分かる)- ベクトルで初期値を入れると、縦列から埋めていく
> m <- matrix(1:6, nrow = 2, ncol = 3)
> m
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
- ベクトルにdim属性を加えるでも行列を作成可能
> m <- 1:10
> dim(m) <- c(2, 5)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
ファクター(因子)
- ベースラインレベルは
levels()
で設定可能
欠損値
- NA / NaN
- 同じNAでも違う型になる
- NaN ∈ NA
データフレーム
- 表形式のデータ
名前
- オブジェクトには名前を付けることが可能
- names()
- dimnames()
ファイルの読み書き
read.table <-> write.table // 表形式データ
read.csv <-> write.csv // カンマ区切り
readLines <-> writeLines // 一行づつ読み込み
source <-> dump // Rのソースコード
dget <-> dput // 単一のオブジェクトの読み書き
load <-> save // 複数のオブジェクトの読み書き
unserialize <-> serialize // ?
read.tableで読み込むときのオプション指定
- file = (string)ファイル名
- header = (logical)ヘッダー行の有無
- sep = (char)区切り文字
- colClasses =
- nrows = (int)行数
- comment.char = (char)コメント文字
- skip = (int)読み込みを飛ばす行数
- stringsAsFactors = (logical)文字列型をファクターとして読み込むかどうか
データ量が少ない場合は、オプション無しのファイル名だけで良い
x <- read.table(“data.txt")
read.table()
のデフォルトの挙動は以下のとおり
- 「#」で始まる行は飛ばす
- 読み込む行数を自動で計算
- 各列の型を自動で判定
read.csv()
は区切り文字がカンマになっていること以外は、read.table()
と同じ
read.table(file, sep=",")
データ量が大きい場合
- Rのヘルプページに有益な情報がたくさんある
- 必要なメモリ量をおおまかに計算したほうが良い
- コメント行が存在しない場合は
comment.char = ""
を指定する colClasses
を指定すると読み込みがおよそ2倍は早くなる- 型が全て同じ場合は、
colClasses = "numeric"
のように一つ指定するだけで良い。 - 下記のようなコードで自動判定を使いながら早く読み込むことが出来る
- 型が全て同じ場合は、
initial <- read.table("datatable.txt", nrows = 100) // 100行だけまず読み込む
classes <- sapply(initial, class) // 型の判定結果を保存
tabAll <- read.table("datatable.txt”, colClasses = classes) // 100行だけ推定した型を使用して、全行読み込む
- nrowsを指定すると、早くはならないがメモリの使用量を抑えることが出来る。
wc
コマンドの結果を使用すると良い
メモリ使用量について
- 1,500,000行、120列の実数表データがある場合のメモリ使用量は下記の通り
1,500,000 * 120 * 8byte(64bitOSのnumeric型の場合)
= 1440000000byte
= 1440000000 / 2^20 MB
≒ 1,373MB
≒ 1.34GB
実際には↑のデータ以外にもメモリを必要とする。だいたい、必要データ数の2倍くらい必要となるため、上記のデータをメモリ2GBのパソコンで読み込もうとするとメモリ不足となってしまう。
ファイル
- file / gzfile / bzfile / url
- openオプション:
- r=読み込み専用
- w=書き込み(新規作成)
- a=書き込み(追記)
- rb, wb, ab = Windowsのバイナリモード用