# 数値型
1
3.14
# 論理型
TRUE
FALSE
# 文字列型
"apple"
"123"
# 因子型、日付型などはまた後日…Rのデータ型と演算
Rの基礎的なデータ操作方法(データ型とその演算)を紹介します。
データ型
Rでよく使うデータ型には、数値型、論理型、文字列型、因子型、日付型などがあります。
Rのコードにおいて、行の先頭に#記号があると、Rはその行の内容を評価(実行)しません。 なので、Rのコード中になんらかのメモやコメントを残したい場合に、この#記号を使うことができます。
行の先頭に#記号を挿入することをコメント・アウトといいます。 専用のキーボード・ショートカットも用意されていて、Windowsは[Ctrl]+[Shift]+[C]、Macは[Command]+[Shift]+[C]です。 コメント・アウトを解除するのにも、同じキーボード・ショートカットを使います。
演算
演算
Rで四則演算をやってみましょう。
# 足し算
7 + 3[1] 10
# 引き算
7 - 3[1] 4
# 掛け算
7 * 3[1] 21
# 割り算
7 / 3[1] 2.333333
# 割り算(商)
7 %/% 3[1] 2
# 割り算(余り)
7 %% 3[1] 1
# 冪乗
7 ** 3[1] 343
# これも冪乗
7 ^ 3[1] 343
大小関係や等号・不等号などの関係演算は、以下のように実行します。 演算結果は、TRUEもしくはFALSEの論理型データになります。
# 大小関係
7 > 3[1] TRUE
7 < 3[1] FALSE
# 等号・不等号
7 == 3[1] FALSE
7 != 3[1] TRUE
NOTやAND・ORなどの論理演算は、以下のようにします。
# NOT(否定)
!TRUE[1] FALSE
!FALSE[1] TRUE
# AND(論理積)
TRUE & TRUE[1] TRUE
TRUE & FALSE[1] FALSE
# OR(論理和)
TRUE | TRUE[1] TRUE
TRUE | FALSE[1] TRUE
数学関数
Rには、例えば以下のような数学関数が用意されています。
# 平方根
sqrt(2)[1] 1.414214
# 自然対数
log(10)[1] 2.302585
# 常用対数
log10(100)[1] 2
# 指数関数
exp(1)[1] 2.718282
# 丸める
round(pi, 2)[1] 3.14
# 切り上げ(天井関数)
ceiling(pi)[1] 4
# 切り下げ(床関数)
floor(pi)[1] 3
Rにも、他のプログラミング言語と同様に、いくつかの定数が用意されています。
pi # 円周率
Inf # 無限大(Infinity)
NULL # 空値
NaN # 非数(Not a Number)
NA # 欠損値(Not Available)このうちNAは、一般的なプログラミング言語では見かけることのない定数で、欠損値のための定数が用意されているというのは、統計解析のための言語であるRの特徴だといえるでしょう。
代入
Rで変数に値を代入するには、<-や->を使います(->はあまり使いません)。 =でも代入できます(<-と=のどちらを使うかは、好みです)。
x <- 7
y <- 3
z <- x / y
z[1] 2.333333
x <- x ** 2
x[1] 49
z = sqrt(x)
z[1] 7
1 / y -> z
z[1] 0.3333333
ベクトル
Rのプログラミング言語としての特徴の1つは、ベクトルや行列が扱いやすいことです。
ベクトルの作成
Rのベクトルは、数学のベクトルとほとんど同じ概念で、同じ型のデータが、2つ以上まとめたデータです。 数学のベクトルと違って、数値型以外の型(例えば文字列型)のデータもまとめてベクトルにすることができます。
いろいろな方法でベクトルを作成することができます。
# 要素を結合
c(2, 4, 6)[1] 2 4 6
# 整数の並び
2:6[1] 2 3 4 5 6
# 連続する数の間隔を指定
seq(2, 5, by = 0.5)[1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0
# ベクトルを繰り返す
rep(1:2, times = 3)[1] 1 2 1 2 1 2
# ベクトルの要素を繰り返す
rep(1:2, each = 3)[1] 1 1 1 2 2 2
ベクトル関数
ベクトルを引数にとる関数もあります。
x <- c(3, 6, 2, 5, 1, 3)
# 合計
sum(x)[1] 20
# 平均
mean(x)[1] 3.333333
# 標準偏差
sd(x)[1] 1.861899
# 並べ替え
sort(x)[1] 1 2 3 3 5 6
# 逆順
rev(x)[1] 3 1 5 2 6 3
# ユニークな値
unique(x)[1] 3 6 2 5 1
# 各要素の個数
table(x)x
1 2 3 5 6
1 1 2 1 1
# ベクトルの長さ(要素の数)
length(x)[1] 6
ベクトルの演算
ベクトルの演算では、要素ごとの演算の結果を格納したベクトルが得られます。
x <- c(2, 4, 6, 8)
y <- c(1, 2, 3, 4)
# 足し算
x + y[1] 3 6 9 12
# 引き算
x - y[1] 1 2 3 4
# 掛け算
x * y[1] 2 8 18 32
# 割り算
x / y[1] 2 2 2 2
# 商
x %/% y[1] 2 2 2 2
# 余り
x %% y[1] 0 0 0 0
ベクトルの長さが異なる場合、長いベクトルの長さが短いベクトルの長さの倍数ならば、短いベクトルを繰り返して演算されます。
x <- c(2, 4, 6, 8)
y <- c(1, 2)
z <- c(1, 2, 1, 2) # zはyを2つつなげたベクトル
x / y # yが短いので、yを2つつなげたベクトルで演算[1] 2 2 6 4
x / z # yを2つつなげたベクトルで演算した結果と同じ[1] 2 2 6 4
y <- 2 # スカラー
x / y # xの要素をそれぞれ2で割る演算になる[1] 1 2 3 4
ベクトルの要素を取り出す
ベクトルの要素を取り出すさまざまな方法があります。
x <- c(3, 6, 2, 5, 1, 3)
# 4番目の要素
x[4][1] 5
# 4番目以外の要素
x[-4][1] 3 6 2 1 3
# ベクトルで位置を指定
x[1:2][1] 3 6
x[c(1, 4)][1] 3 5
x[-(1:2)][1] 2 5 1 3
# 値による指定
x[x == 3][1] 3 3
x[x >= 5][1] 6 5
# 集合に含まれる要素
x[x %in% c(1, 3, 5)][1] 3 5 1 3
%in%演算子
%in%演算子は、値のマッチングに関する二項演算子です。 演算子の左側の要素が、右側の要素(通常はベクトル)に含まれるかどうかを表す論理型データ(TRUEもしくはFALSEを返します。例えば、
1 %in% c(1, 2, 4)[1] TRUE
3 %in% c(1, 2, 4)[1] FALSE
演算子の左型をベクトルにすると、ベクトルの要素それぞれについての%in%の結果を、ベクトルで返します。
c(1, 3) %in% c(1, 2, 4)[1] TRUE FALSE
上の例では、
x %in% c(1, 3, 5)[1] TRUE FALSE FALSE TRUE TRUE TRUE
x[c(TRUE, FALSE, FALSE, TRUE, TRUE, TRUE)][1] 3 5 1 3
の結果が表示されているということです。
データ型の変換
x <- c(1, 0, 1)
# データ型の確認
class(x)[1] "numeric"
# 論理型に変換
y <- as.logical(x)
y [1] TRUE FALSE TRUE
# 論理型データはTRUEを1にFALSEを0として算術演算できる
sum(y)[1] 2
# 文字列型に変換
z <- as.character(x)
z[1] "1" "0" "1"
# 文字列型を数値型に変換
as.numeric(z)[1] 1 0 1
type.convert(z, as.is = TRUE)[1] 1 0 1
リスト
いろいろなデータ型を持つ要素を、まとめて1つのリストにすることができます。
リストの作成
z <- list(x = 1:3, y = c("a", "b"))
z$x
[1] 1 2 3
$y
[1] "a" "b"
リストの要素を取り出す
# リストzの2番目の要素
z[[2]][1] "a" "b"
# リストzの名前がyの要素
z$y[1] "a" "b"
データフレーム
データフレームは、分析に使うデータを保持する構造として、最も一般的なものの1つです。 スプレッドシート上でデータを管理するときのように、列名(colmun name)と行番号(row index) を持つ2次元配列の格好をしています。
データフレームの作成
データベースをつくるには、data.frame関数を使います。以下の表のようなデータを持つデータフレームをつくるコードを示します。
| names | division | wins | draws | losses | goals_for | goals_against |
|---|---|---|---|---|---|---|
| Avispa | J1 | 12 | 14 | 12 | 33 | 38 |
| Giravanz | J3 | 15 | 11 | 12 | 41 | 39 |
| Sagan | J1 | 10 | 5 | 23 | 48 | 68 |
| V-Varen | J2 | 21 | 12 | 5 | 74 | 39 |
| Roasso | J2 | 13 | 7 | 18 | 53 | 62 |
| Trinita | J2 | 10 | 13 | 15 | 33 | 47 |
| Tegevajaro | J3 | 12 | 10 | 16 | 46 | 50 |
| United FC | J2 | 7 | 9 | 22 | 35 | 59 |
teams <- data.frame(
names = c("Avispa", "Giravanz", "Sagan", "V-Varen", "Roasso", "Trinita", "Tegevajaro", "United FC"),
division = c("J1", "J3", "J1", "J2", "J2", "J2", "J3", "J2"),
wins = c(12, 15, 10, 21, 13, 10, 12, 7),
draws = c(14, 11, 5, 12, 7, 13, 10, 9),
goals_for = c(33, 41, 48, 74, 53, 33, 46, 35),
goals_against = c(38, 39, 68, 39, 62, 47, 50, 59)
)
teams names division wins draws goals_for goals_against
1 Avispa J1 12 14 33 38
2 Giravanz J3 15 11 41 39
3 Sagan J1 10 5 48 68
4 V-Varen J2 21 12 74 39
5 Roasso J2 13 7 53 62
6 Trinita J2 10 13 33 47
7 Tegevajaro J3 12 10 46 50
8 United FC J2 7 9 35 59
ただし、実際の分析ではデータは外部ファイルから読み込むことが多く、このようにコードを書いてデータフレームを作成する場面は少ないとは思います(外部ファイルからデータを読み込む方法は、後ほど紹介します)。
データフレームの操作
データフレームの大きさ(行数と列数)を知るには、dim関数を使います。 行数のみを出力するnrow関数や、列数のみを出力するncol関数もあります。 これらから、teamsは8行6列のデータフレームであることがわかります。
# 行数と列数
dim(teams)[1] 8 6
# 行数
nrow(teams)[1] 8
# 列数
ncol(teams)[1] 6
データフレームから要素を抽出するには、以下に示すような方法があります。
# 行番号と列番号を指定する
teams[3, 2][1] "J1"
# 行を抜き出す
teams[c(2, 3), ] names division wins draws goals_for goals_against
2 Giravanz J3 15 11 41 39
3 Sagan J1 10 5 48 68
# 列を抜き出す
teams[, 1][1] "Avispa" "Giravanz" "Sagan" "V-Varen" "Roasso"
[6] "Trinita" "Tegevajaro" "United FC"
teams[, "names"][1] "Avispa" "Giravanz" "Sagan" "V-Varen" "Roasso"
[6] "Trinita" "Tegevajaro" "United FC"
teams$names[1] "Avispa" "Giravanz" "Sagan" "V-Varen" "Roasso"
[6] "Trinita" "Tegevajaro" "United FC"
# 値が条件を満たすものを抜き出す
teams[teams$division == "J1", ] names division wins draws goals_for goals_against
1 Avispa J1 12 14 33 38
3 Sagan J1 10 5 48 68
teams[teams$goals_against > 60, ] names division wins draws goals_for goals_against
3 Sagan J1 10 5 48 68
5 Roasso J2 13 7 53 62