ご挨拶
今回の記事も、大規模なデータ処理のための基礎知識編のつもりです。
※独学の部分も多いので、修正点等あればお気軽にコメントでのご指摘をお願いします……。
前の記事はコチラ
【都市・観光情報学でのRマニュアル】1 データ型
データ構造とは
複数の値を格納する「入れ物」をデータ構造と言う。Rではデータ構造の種類によって格納できるデータ型や操作方法が異なる。
・ ベクトル(vector)
同一データ型の要素を並べた1次元配列。
基本データ型(numeric, integer, logical, complex, character, raw)しか代入できない。
#ベクトルの作り方(よく使うやつ)
a <- numeric(4)
a
# [1] 0 0 0 0
name <- c("Tanaka", "Satou", "Yamada")
name
# [1] "Tanaka" "Satou" "Yamada"
・ 因子(factor)
character型のデータをカテゴリデータ(名義尺度・順序尺度で表されるデータ)として扱えるようになる。
因子化しておくと、統計解析を行う際に文字列の見た目のまま変数として扱えるため、使用頻度は多い。
# 文字列(名義尺度) → 因子
factors <- factor(c("Tokyo", "Chiba", "Chiba", "Tokyo", "Kanagawa"))
factors
# [1] Tokyo Chiba Chiba Tokyo Kanagawa
# Levels: Chiba Kanagawa Tokyo
# 文字列(順序尺度) → 因子
gakureki <- factor(c("大卒", "大卒", "修士", "高卒", "高卒", "大卒", "高卒"),
levels = c("中卒", "高卒", "大卒", "修士"),
ordered = TRUE)
gakureki
# [1] 大卒 大卒 修士 中卒 高卒 大卒 高卒
# Levels: 中卒 < 高卒 < 大卒 < 修士
補足
内部的には「文字列のベクトル」を「ラベル+整数のベクトル」として扱うため、重複の多い文字列を扱う際はメモリ効率が良くなる。
・ 行列(matrix)
同一データ型の要素を行×列に並べた2次元配列。
線形代数における行列と同じで、要素が数値の場合は行列計算(加算・乗算・転置など)も可能。
# 行列の作成
m <- matrix(1:6, nrow = 2, ncol = 3)
m
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
# 行列操作(例:転置)
t(m)
# [,1] [,2]
# [1,] 1 2
# [2,] 3 4
# [3,] 5 6
・ データフレーム(data.frame)
異なるデータ型の列を持つ表形式の構造。
列ごとに列名やデータ型を指定することができ、統計解析やデータ整理などで多用する。
(個人的には、文法の柔軟性や処理速度に優れたデータテーブル(data.table)の利用がおすすめ)
# data.frameの作成
df <- data.frame(id = 1:3, nema = c("Tanaka", "Satou", "Yamada"))
df
# id nema
# 1 1 Tanaka
# 2 2 Satou
# 3 3 Yamada
# id列の抽出
df$id
# [1] 1 2 3
・ リスト(list)
異なるデータ型の要素をまとめて格納できる。また、データ構造を格納して入れ子構造にすることも出来る。
かなり柔軟な運用ができるので使いどころは非常に多い。
# リストの作成
list_ex <- list(num = c(1:3),
char = "Tokyo",
df = data.frame(x = c(1, 2), y = c("a", "b")))
# リストの要素にアクセス
# 要素名でアクセス
list_ex$num
# [1] 1 2 3
list_ex[["char"]]
# [1] "Tokyo"
# 順番でアクセス
list_ex[[3]]
# x y
# 1 1 a
# 2 2 b
1 - (2) まとめ
-
Rで複数の値を同時に扱うときは、データ構造という「入れ物」に格納してから処理することになる。
・ベクトル
同じ型のデータを1列に並べたいとき
・リスト
異なる方や構造を1つにまとめたいとき
・データフレーム
表形式で「列=属性」×「行=レコード」にまとめたいとき
入れ物ごとに格納できるデータ型や処理方法が変わってくるため、データの形式や行いたい処理に合わせて入れ物選びが肝心。 -
データを追加する際は主に
- 既存のデータ構造の末尾に新しいデータ(レコード)を追加する
- 空のベクトル・リストを作成しておいて、後からアドレスを指定して格納する
の2通りの方法がある。
実務的な面では、2の方がメモリに負荷がかからず処理速度が速い。 -
実際に表形式のデータを扱う際は'data.table'を利用することが強く推奨される。
補足
ベクトルやデータフレームは処理の度にデータをコピー&新規作成する仕組みが多く、データサイズが大きいとメモリ効率が悪化する。一方で、data.tableは追加・更新が参照ベースで行われ、速度とメモリ効率が大幅に改善される。
登場した関数
・ 引数をベクトルにまとめる関数
c(x, …)
| 引数 | 説明 |
|---|---|
| x | 格納するデータ。複数指定可能。 |
Tips
異なる方を同時に引数とした場合、最も幅の広いデータ型に自動変換される
vec <- c(3, 4L, "5")
class(vec)
# [1] "character"
Tips
基地のベクトルを結合して新しいベクトルを作ることも可能(= データの追加)
vec1 <- c(1:3)
vec2 <- c(4:5)
# vec1とvec2を結合する
vec3 <- c(vec1, vec2)
vec3
# [1] 1 2 3 4 5
・ 空の数値ベクトルを作成する関数
要素は全て0になる。
numeric(length)
| 引数 | 説明 |
|---|---|
length |
生成するベクトルの長さ。省略した場合0
|
Tips
空ベクトルを作成してから、あとでアドレスを指定してデータを追加していく方法
# まずは空ベクトルを作成
vec <- numeric(4)
vec
# [1] 0 0 0 0
# i番目の要素にi×2を格納
for (i in 1:4) {
vec[i] <- i * 2
}
vec
# [1] 2 4 6 8
・ 因子型データを作成する関数
使い方は因子(factor)を参照
factor(x, levels, labels, exclude, ordered, nmax)
| 引数 | 説明 |
|---|---|
x |
因子に変換したいベクトル |
levels |
水準を指定。省略時にはunique(x)(重複を削除したxの要素)の順序になる。 |
labels |
各levelにたいして表示するときの見た目の名前を指定 |
exclude |
除外する値を指定。省略時はNA
|
ordered |
順序付き因子にするかをTRUE/FALSEで指定。省略時にはFALSE
|
nmax |
内部的な引数なので指定不要 |
・ 行列を作成する関数
matrix(data, nrow, ncol, byrow, dimnames)
| 引数 | 説明 |
|---|---|
data |
行列に変換したいベクトル |
nrow |
行数(整数のみ) |
ncol |
列数(整数のみ) |
byrow |
ベクトルを行単位で詰めていくかをTRUE/FALSEで指定。省略時にはFALSE
|
dimnames |
行名・列名をリスト形式で指定可能(あんまり使わない) |
Tips
デフォルトでは列ごとに要素が埋まっていく
# デフォルト(列ごとに埋まっていく)
m <- matrix(c(1:6), nrow = 3, ncol = 2)
m
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
# byrow = TRUEに設定(行ごとに埋まっていく)
m <- matrix(c(1:6), nrow = 3, ncol = 2, byrow = TRUE
m
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
・ データフレームを作成する関数
使い方はデータフレーム(data.frame)を参照。
data.frame(col.nemes = data, …
row.names,
check.rows,
check.names,
fix.empty.names,
stringsAsFactors)
| 引数 | 説明 |
|---|---|
col.names = data |
データフレームに格納したいベクトル。col.namesに文字列を入れることで列名の指定が可能(省略可) |
row.names |
行名を指定。省略時は自動で1, 2, ...と割り振られる。 |
check.rows |
列ごとに行数が一致しているかの確認をするかをTRUE/FALSEで指定。省略時はTRUE
|
fix.empty.names |
空の列名を自動で補完するかをTRUE/FALSEで指定。省略時はTRUE
|
stringAsFactor |
文字列を因子型にするかをTRUE/FALSEで指定。省略時はFALSE
|
・ リストを作成する関数
使い方はリスト(list)を参照。
list(col.names = data, ...)
| 引数 | 説明 |
|---|---|
col.names = data |
リストに格納したいオブジェクト(複数指定可能)。col.namesの部分に文字列を入れることで列名の指定が可能(省略可) |
次の投稿
Rの基本構文や予約語について書くと思います。
> 書きました。
【都市・観光情報学でのRマニュアル】3 Rの基本構文