Rの基本操作

1 R入門

2 Rのインターフェース

Rを起動するとコンソールが立ち上がります.RStudioを利用している場合には,複数のパネルから構成されるウィンドウが立ち上がり,その左下のパネルがコンソールになっています.

そこにコードを入力してEnterを押すと,コードが実行されます.

2.1 入力

Rのコンソールには,一定の文法に従って命令(command)を入力します.このような命令を表現(expression)といいます.たとえば,以下の表現は,"こんにちは,世界" という文字列を出力するというものです.

print("こんにちは,世界")
[1] "こんにちは,世界"

表現が不完全であったり,誤ったりしていると,エラーになります.次の例はエラーになります.

print()
Error in print.default(): argument "x" is missing, with no default

3 計算

3.1 四則演算

+, -, *, /, ^, %%などの記号を使うことで基本的な計算を実行できます.これらを実行すると,その計算結果が出力されます.

1 + 1 # 足し算
5 - 2 # 引き算
3 * 3 # 掛け算
2 / 4 # 割り算

3 ^ 3   # 累乗(3の3乗)
57 %% 3 # 剰余
3 %/% 2 # 整数のみの割り算

なお,Rではハッシュ(#)はコメントアウト記号として使われ,#よりも右側の文字や数字はすべてコメントとして無視されます.ちなみに,3 ** 3も3の3乗という表現になり,累乗を計算できますが,あまり使われません.3 * 3と見分けづらく,コードの可読性が下がるのでおすすめしません.

3.2 数学関数

Rには基本的な数学的操作を行うためのビルトイン関数がいくつか用意されています.

abs(-3) # 絶対値
## [1] 3

sqrt(9) # 平方根 (9 ^ 0.5でもよい)
## [1] 3

round(0.189, digits = 2) # 偶数への丸め
## [1] 0.19

log(2.718) # 自然対数
## [1] 0.9998963

exp(1) # 指数関数
## [1] 2.718282

ceiling(1.1) # 天井関数
## [1] 2

floor(1.9) # 床関数
## [1] 1

4 割り当て演算

Rでは割り当て演算子<- を使うことで,表現の出力結果に名前をつけて後で使うために格納することができます.

x <- 1 + 1

x
[1] 2
x / 2
[1] 1

名前をつけることを,便宜的に「オブジェクトを作る」と言うことがあります.上の例の場合,「1 + 1の出力を格納しているオブジェクトxを作った」と便宜的に言うことが多いです.上書きは簡単で,同じ名前でもう一度割り当てをすればよいだけです.

x <- 10

x
[1] 10

作ったオブジェクトを使って,さらに別のオブジェクトを作ることもできます.

y <- x / 2

y
[1] 5

割り当ては,割り当ての時点での値で固定されるので,それ以降にxを上書きしても,改めてyを上書きしない限りyの値は変わりません.

x <- 100

y
[1] 5

5 オブジェクトのクラス

5.1 基本のクラス

Rのオブジェクトには5つの基本的なクラスがあります.

  • 文字列(character)

  • 数値(numeric)

  • 整数(integer)

  • 複素数(complex)

  • 論理値(logical)

文字列はクォーテーションマーク("")を使うことで入力できます.

greeting <- "こんにちは,世界!"

greeting
[1] "こんにちは,世界!"

class()関数を用いると,オブジェクトのクラスがわかります.

class(greeting)
[1] "character"

なお,文字列になっている数字はあくまで文字列として扱われるので注意してください.

four <- "4"

four + 1
Error in four + 1: non-numeric argument to binary operator

数値は文字通り1, 0.71, 3.14といった数値です.整数はその特殊例で,小数部を持たないものです.明示的に整数として扱うには,Lという記号を使います.

class(10)
[1] "numeric"
class(10L)
[1] "integer"

複素数はiという記号を使って,1iというようにして虚数部を表すことができます.

class(1 + 1i)
[1] "complex"

論理値は,TRUEFALSEという表現で使うことができます.

x <- TRUE

x
[1] TRUE
class(x)
[1] "logical"

5.2 特殊な値

正の無限大を表すにはInfという表現を使います.負の無限大は,-Infです.

1 / Inf
[1] 0

数学的に未定義な値はNaNとなります.Not ao Noumberの略です.

1 / 0
[1] Inf

6 ベクトル

6.1 ベクトルの作り方

基本的にRでは値をベクトルとして扱います.ベクトルを作るにはc()関数を使います.

x <- c(1, 3, 4)

x
[1] 1 3 4

なおc()のcはcombineを表しています.is.vector(x)関数を使えば,オブジェクトがベクトルかどうかを判断できます.

is.vector(x)
[1] TRUE

なお,要素が1つであってもベクトルです.

x <- 3 # 要素が1つ

is.vector(x)
[1] TRUE

もちろん,数値以外のものもベクトルにできます.

country <- c("Japan", "China", "Korea")
result <- c(TRUE, FALSE, TRUE, TRUE)

ただし,ベクトルに含まれる要素は同じクラスである必要があります.異なるクラスの値をベクトルにしようとした場合,強制的にいずれかのクラスに統一されます.文字列が1つでも含まれていれば文字列になります.数値と論理値の場合は数値になり,TRUEは1としてFALSEは0として扱われます.

class(c(2, 4, "5"))   # 文字列
## [1] "character"
class(c(TRUE, 0, 1))   # 数値
## [1] "numeric"
class(c(TRUE, "TRUE")) # 文字列
## [1] "character"

6.2 クラスの変換

ベクトルのクラスを別のクラスに明示的に変換するためには,以下の関数を利用します.

  • as.numeric() : 文字列の数字を数値に,または,論理値を数値に変換.
  • as.logical() : "TRUE"または"FALSE"という文字列を論理値に,または,数値を論理値に変換.
  • as.character() : 文字列に変換.
x <- c("2", "3.1", "-0.1") # 文字列の数字
class(x) # クラスは文字列
## [1] "character"

x <- as.numeric(x) # 数値に変換
class(x) # 数値
## [1] "numeric"


x <- c("TRUE", "FALSE", "TRUE") # 文字列の論理値
class(x) # クラスは文字列
## [1] "character"

x <- as.logical(x) # 論理値に変換
class(x) # 論理値
## [1] "logical"

変換のしようがない場合はNAとなり,多くの場合は警告メッセージが表示されます.

as.numeric("9:00 a.m.")
## Warning: NAs introduced by coercion
## [1] NA

6.3 ベクトルの要素の抽出

ベクトルの一部を抽出することを,サブセッティングと言います.サブセッティングには,サブセッティング演算子[]を用います.使い方は,ベクトルの直後に[]を置いて,その中に抽出したい要素の番号をベクトルで指定します.

たとえば,ベクトルxの要素番号1, 3, 5の要素を取り出したい場合は次のように指定します.

x <- c("a", "b", "c", "d", "e", "f", "g")
x
## [1] "a" "b" "c" "d" "e" "f" "g"

y <- x[c(1, 3, 5)]
y
## [1] "a" "c" "e"

このように,抽出した要素を含むベクトルが出力されます.要素が取り出される順番は,要素番号を指定するベクトルおいて,どの順番で要素番号を指定するかに指定します.たとえば,次のように要素番号を指定すると,先ほどとは反対の順番で要素が抽出されます.

y <- x[c(5, 3, 1)]
y
## [1] "e" "c" "a"

もちろん,抽出したい要素が1つだけなら次のように指定しても構いません.

y <- x[3] # x[c(3)]と同じ
y
## [1] "c"

要素番号の符号を反転させて負の値を指定すると,その要素番号以外の要素だけを抽出できます.

y <- x[c(-1, -5)]
y
## [1] "b" "c" "d" "f" "g"

6.4 ベクトルを作る関数

ベクトルを作るにはc()関数を使いますが,要素の値が一定の規則に従う場合には,もっと便利な関数がいくつかあります.

6.4.1 :演算子

要素の値が1ずつ増加していく,または減少していくようなベクトルは:演算子を使うことで作れます.たとえば,1から30まで1ずつ増えていくベクトルは次のように作れます.

x <- 1:30
x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30

逆に,30から1まで1ずつ減っていくベクトルは次のように作れます.

x <- 30:1
x
##  [1] 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6
## [26]  5  4  3  2  1

負の値や小数も同様に1ずつ増える,または減るベクトルを作れます.

-10:-20
##  [1] -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20

0.5:10.5
##  [1]  0.5  1.5  2.5  3.5  4.5  5.5  6.5  7.5  8.5  9.5 10.5

すなわち,:は等差を1とする等差数列を作ってくれる演算子であるとイメージできるでしょう.

6.4.2 seq()関数

seq()関数を用いると,1以外の等差の等差数列が作れます.たとえば,次のコードは0から100まで等差10で増えていく数列(のようなベクトル)を作ります.

x <- seq(from = 0, to = 100, by = 10)
x
##  [1]   0  10  20  30  40  50  60  70  80  90 100

また,byの代わりにlength.outという引数に整数を指定すると,始まりから終わりの数値までの間を均等に分割するようなベクトルが作れます.

x <- seq(from = 0, 100, length.out = 51)
x
##  [1]   0   2   4   6   8  10  12  14  16  18  20  22  24  26  28  30  32  34  36
## [20]  38  40  42  44  46  48  50  52  54  56  58  60  62  64  66  68  70  72  74
## [39]  76  78  80  82  84  86  88  90  92  94  96  98 100

6.4.3 rep()関数

rep()関数は,指定したベクトルの要素を繰り返したベクトルを作ります.たとえば,次のコードはベクトルxを3回繰り返します.

x <- c("A", "B", "C")

y <- rep(x, times = 3)
y
## [1] "A" "B" "C" "A" "B" "C" "A" "B" "C"

引数のeachに整数を指定すると,要素ごとに順番にその値の分だけ繰り返します.

y <- rep(x, each = 3)
y
## [1] "A" "A" "A" "B" "B" "B" "C" "C" "C"

6.5 ベクトルの長さ

ベクトルの長さ,つまり要素の数はlength()関数で計算できます.

x <- 0:10

length(x)
## [1] 11

7 行列

7.1 matrix()関数

ベクトルがあるということは,行列もあります.行列は行(rows)と列(columns)という次元を持ちます.行列を作るには,matrix()関数を使います.引数nrowで行数を,ncolで列数を指定します.たとえば,次のコードは,4行3列の行列を作成します.

x <- matrix(nrow = 2, ncol = 3)

x
##      [,1] [,2] [,3]
## [1,]   NA   NA   NA
## [2,]   NA   NA   NA

行列の次元はdim()関数を使うことで確認できます.

dim(x)
## [1] 2 3

行列の各要素には[]演算子を用いることで抽出できます.たとえば,次のコードは行列xの2行3列を指定します.

x[2, 3]
## [1] NA

割り当て演算子<-を用いることで,その要素に値を割り当てることができます.

x[2, 3] <- 10

x
##      [,1] [,2] [,3]
## [1,]   NA   NA   NA
## [2,]   NA   NA   10

x[2, 3]
## [1] 10

行(または列)かの番号しか指定しない場合は,その行(または列)のすべての要素に抽出できます.また,その行(列)に対してベクトルを割り当てることで行列に値を追加することができます.

x[2, ]
## [1] NA NA 10

x[, 3] <- c(6, 9)

x
##      [,1] [,2] [,3]
## [1,]   NA   NA    6
## [2,]   NA   NA    9

7.2 ベクトルから行列を作る

ベクトルから行列を作ることもできます.次のコードは(1, 2, 3, 4, 5, 6)のベクトルを2行3列の行列に変換します.このとき,列ごとに値があてがわれていることに注意してください.

x <- matrix(1:6, nrow = 2, ncol = 3)

x
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6

行ごとに値をあてがいたい場合は,引数byrow = TRUEを指定してください.

x <- matrix(1:6, nrow = 2, ncol = 3, byrow = TRUE)

x
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6

dim()を用いてベクトルの次元に数値を指定する方法でも,行列を作ることができます.

x <- 1:6

dim(x) <- c(3, 2)

x
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

7.3 rbind()cbind()

同じ長さのベクトルを複数組み合わせて行列を作ることができます.それぞれのベクトルを行として行列を作るにはrbind()関数を用います.

x <- rep("x", 3)
y <- rep("y", 3)

z <- rbind(x, y)

z
##   [,1] [,2] [,3]
## x "x"  "x"  "x" 
## y "y"  "y"  "y"

それぞれのベクトルを列として行列を作るにはcbind()関数を用います.

x <- rep("x", 3)
y <- rep("y", 3)

z <- cbind(x, y)

z
##      x   y  
## [1,] "x" "y"
## [2,] "x" "y"
## [3,] "x" "y"

rbind()cbind()のrとcはそれぞれrow(行)とcolumn(列)を意味しています.

8 リスト

ベクトルは異なるクラスの要素を含むことができません. しかし,それは少し不便です. 数値や文字列,論理値など様々な種類の情報を1つのオブジェクトとして保持した方が都合が良いこともあります. そのようなときには,リスト(list)というオブジェクトを使うと便利です.

リストは異なるクラスの要素を保持することができます. リストはlist()関数で作ることができます.

x <- list(20, "大阪府", FALSE)

x
## [[1]]
## [1] 20
## 
## [[2]]
## [1] "大阪府"
## 
## [[3]]
## [1] FALSE

リストはベクトルを要素として持つこともできます.

x <- list(c(2, 3, 4), FALSE, c("a", "b", "c"))

x
## [[1]]
## [1] 2 3 4
## 
## [[2]]
## [1] FALSE
## 
## [[3]]
## [1] "a" "b" "c"

リストの要素を抽出するには[][[]]を用います. 前者は該当するリストの要素をリストとして,後者は該当するリストの要素をその要素のオブジェクトの種類として抽出します.

x[1]
## [[1]]
## [1] 2 3 4

is.list(x[1])
## [1] TRUE

x[[1]]
## [1] 2 3 4

is.list(x[[1]])
## [1] FALSE

9 ファクター

ファクター(factor)は,カテゴリカルなデータを保持するためのオブジェクトです. 整数のベクトルに文字列のラベルが関連付けられたものをイメージするとよいでしょう. ファクターはfactor()関数を使って作ることができます.

x <- factor(c("群馬県", "群馬県", "福岡県", "福岡県", "大阪府"))

x
## [1] 群馬県 群馬県 福岡県 福岡県 大阪府
## Levels: 大阪府 福岡県 群馬県

9.1 レベル

Levels:のところには,レベル(ラベルの種類)が記載されています. レベルが多いときには一部が省略されます. levels()を使えば明示的にレベルを表示することができます.

levels(x)
## [1] "大阪府" "福岡県" "群馬県"

レベルの順番は文字コードの順番で自動的に設定されます. 明示的に設定するには,factor()levelsという引数で指定します.

x <- factor(c("群馬県", "群馬県", "福岡県", "福岡県", "大阪府"),
            levels = c("群馬県", "大阪府", "福岡県"))

x
## [1] 群馬県 群馬県 福岡県 福岡県 大阪府
## Levels: 群馬県 大阪府 福岡県

9.2 数値的な演算

ファクターは,整数にラベルを振っているものなので,数値に変換すると対応する整数に変換されます.

x
## [1] 群馬県 群馬県 福岡県 福岡県 大阪府
## Levels: 群馬県 大阪府 福岡県

as.numeric(x)
## [1] 1 1 3 3 2

ただし,ファクターは原則として数値として扱われないので,次のようなコードは警告が表示されNAが出力されます.

x[1] > x[3]
## Warning in Ops.factor(x[1], x[3]): '>' not meaningful for factors
## [1] NA

x[2] + x[3]
## Warning in Ops.factor(x[2], x[3]): '+' not meaningful for factors
## [1] NA

9.3 順序

ファクターは順序を持つことができます. 順序を持つファクターは,レベルに大小関係が定義されます. 順序は,factor()の中でordered = TRUEと引数を指定すると与えることができます. 順序はレベルの順番と同様になります.

x <- factor(c("群馬県", "群馬県", "福岡県", "福岡県", "大阪府"),
            levels = c("群馬県", "大阪府", "福岡県"),
            ordered = TRUE)

x
## [1] 群馬県 群馬県 福岡県 福岡県 大阪府
## Levels: 群馬県 < 大阪府 < 福岡県

順序を持つファクターの場合は,大小関係を調べることができます.

x[1] > x[3]
## [1] FALSE

x[2] == x[3]
## [1] FALSE

10 欠損値

欠損値はNAで表されます.ベクトルの各要素が欠損値であるかどうかは,is.na()で確認できます.

is.na(c(NA, 1, 3, 4, 5))
## [1]  TRUE FALSE FALSE FALSE FALSE

NAに対する数学的な演算や論理的な演算の結果は基本的にNAとなります.特に,欠損値であるかどうかを確かめるために,x == NAのようにするとNAが返ってくるだけなので注意してください.

NA > 2
## [1] NA

NA + 3
## [1] NA

NA == NA
## [1] NA

x <- c(NA, 1, 3, 4, 5)

x == NA 
## [1] NA NA NA NA NA

数学的に未定義な操作をした際に出力されるNaNにもほぼ同様のことが言えます.

NaN > 2
## [1] NA

NaN + 3
## [1] NaN

NaN == NaN
## [1] NA

x <- c(NaN, 1, 3, 4, 5)

x == NaN 
## [1] NA NA NA NA NA

NaNかどうかを確かめるには,is.NaN()関数を用います.

11 データフレーム

11.1 データフレームの作り方

データフレームは,テーブル形式のデータを保持するのに便利なオブジェクトです. 特に,Rでは,統計的な分析を行う関数の多くがデータフレームを使うことで円滑な操作が可能になります. データフレームは,各行が各観察値(各個体)に相当し,各列が変数に相当します. データフレームを作るには,data.frame()関数を用います.

以下のように,=を使って,左辺では変数名を,右辺では値を指定して,データフレームを作ります.

mydata <- data.frame(
  hoge = 1:5,
  fuga = c("a", "b", "c", "d", "e"),
  piyo = factor(c("犬", "犬", "犬", "猫", "猫"))
)

mydata
##   hoge fuga piyo
## 1    1    a   犬
## 2    2    b   犬
## 3    3    c   犬
## 4    4    d   猫
## 5    5    e   猫

見て分かる通り,データフレームは異なるクラスのオブジェクトを各変数として保持することができます. なお,データフレームの各変数(各列)の長さは同じである必要があります.

11.2 行数と列数

データフレームの行数や列数を計算するには,nrow()ncol()dim()を使います.

nrow(mydata) # 行数
## [1] 5

nrow(mydata) # 列数
## [1] 5

dim(mydata)  # 行数と列数
## [1] 5 3

11.3 データフレームの変数名

データフレームの各変数の名前を抽出するには,colnames()を使います.各変数の名前を順番にベクトルとして返してくれます.

colnames(mydata)
## [1] "hoge" "fuga" "piyo"

データフレームの各変数の名前を変更するには,colnames()を使って,当該の変数名に文字列を割り当てて上書きします.

colnames(mydata)[1] <- "hogehoge"

mydata
##   hogehoge fuga piyo
## 1        1    a   犬
## 2        2    b   犬
## 3        3    c   犬
## 4        4    d   猫
## 5        5    e   猫


colnames(mydata) <- c("foo", "bar", "baz")

mydata
##   foo bar baz
## 1   1   a  犬
## 2   2   b  犬
## 3   3   c  犬
## 4   4   d  猫
## 5   5   e  猫

11.4 データフレームの抽出

データフレームの抽出の仕方は行列の場合とほぼ同じです.

mydata[3, 2] # 要素
## [1] "c"

mydata[3, ]  # 行
##   foo bar baz
## 3   3   c  犬

mydata[, c(1, 3)]  # 列
##   foo baz
## 1   1  犬
## 2   2  犬
## 3   3  犬
## 4   4  猫
## 5   5  猫

列については,変数名を使って次のように抽出することも可能です.

mydata["baz"]
##   baz
## 1  犬
## 2  犬
## 3  犬
## 4  猫
## 5  猫

mydata[2, c("foo", "baz")]
##   foo baz
## 2   2  犬

$を使って次のように抽出することもできます.

mydata$foo
## [1] 1 2 3 4 5

11.5 データフレームの更新

データフレームの特定の値を変更するには,行列と同じようにその要素を抽出して,新しい値を割り当てます.

mydata[1, 1] <- 99

mydata
  foo bar baz
1  99   a  犬
2   2   b  犬
3   3   c  犬
4   4   d  猫
5   5   e  猫

変数ごとにまとめて割り当てることもできます.

mydata$foo <- seq(10, 100, 20)
mydata
##   foo bar baz
## 1  10   a  犬
## 2  30   b  犬
## 3  50   c  犬
## 4  70   d  猫
## 5  90   e  猫

mydata$foo <- 0.1 * (mydata$foo)
mydata
##   foo bar baz
## 1   1   a  犬
## 2   3   b  犬
## 3   5   c  犬
## 4   7   d  猫
## 5   9   e  猫

11.6 新しい変数の作り方

新しい変数をデータフレームに追加したい場合は,$を使って新しい変数名にベクトルを割り当てます.

mydata$new <- c("きのこ", "きのこ", "たけのこ", "たけのこ", "たけのこ")

mydata
##   foo bar baz      new
## 1   1   a  犬   きのこ
## 2   3   b  犬   きのこ
## 3   5   c  犬 たけのこ
## 4   7   d  猫 たけのこ
## 5   9   e  猫 たけのこ