7  基本的な操作

7.1 電卓としてのR

 ここからは実際にRを使ってみよう。まず、新しい R Script を開くために、Cmd/Ctrl + Shift + N を入力する1(“File” メニューから “New File” - “R Script” を選んでも良い)。すると、 左上の Source Pane に “Untitled1” というタブが登場し、その pane 上でコードが入力できるようになる。ここで 3 + 3 と入力し、その行にカーソルを留めたまま command + return(Mac)または Ctrl + Enter を押してみよう。command + return というのは、command キーを押したまま、return キーも押すという意味である。

図 7.1: コード入力の例

 Source ペイン (Untitled1) に入力したコードが Console(本書第4章の説明どおりにカスタマイズしていれば、RStudio 内の右上画面)に転送され、計算結果が表示される。Rのコードは Console に直接打ち込むこともできるが、Sourceペインに入力してから Console に転送する方法が基本である2。 Source ペインの内容をファイルに保存すれば、後でもう1度同じコードを実行したり、コードを他のプロジェクトで再利用することができるようになる。先ほど 3 + 3 を入力した画面にカーソルを合わせ、Cmd/Ctrl + S を押してみよう。ファイルの保存を促されるので、ファイル名をつけて保存しよう。このとき、.R というファイル名拡張子を付ける。これにより、ファイルがRスクリプトとして認識される。例えば、“practice01.R” という名前をつけて保存しよう。Sourceペインの上部に表示されるタブの名前が、“Untitled1” から “practice01.R” に変わることが確認できるはずだ。

 以下にRで計算する例を示すので、コードを practice01.R に入力し、command + return (Ctrl + Enter) で Console に送り、実行結果を確認しよう。背景が灰色になっている部分に示されているのが、Rのコマンドである。ただし、##から始まる部分は計算結果である。また、コードブロックのうち、 #(ハッシュ記号)で始まる部分はコメントであり、Rで評価(計算)されない。コメントの使い方については第24章で詳しく解説する。

7.1.1 算術演算子

 まずは、簡単な足し算と掛け算を実行してみよう。

3 + 3
[1] 6
8 * 2
[1] 16

これ以外の基本的な演算に使う記号とその簡単な使い方は以下のとおりである。

演算子 意味 結果
+ 2 + 5 7
- 2 - 8 -6
* 7 * 3 21
/ 16 / 5 3.2
^** 累乗(べき乗) 2^3または2 ** 3 8
%% 剰余 (モジュロ) 18 %% 7 4
%/% 整数商 18 %/% 7 2

7.1.2 論理演算子

 論理演算子とは、入力した式が真か偽かを判定する演算子である。返り値(戻り値)は TRUE(真の場合)または FALSE(偽の場合)のいずれかとなる。たとえば、「3 > 2」は真なので、TRUE が返される。しかし、「2 + 3 = 1」は偽なので、FALSEが返される。実際にやってみよう。

3 > 2
[1] TRUE
2 + 3 == 1
[1] FALSE

 このように、等しいかどうかを表す記号は = ではなく ==(二重等号)なので注意されたい。

 論理演算子にも、いくつかの種類がある。

演算子 意味 結果
1 x < y xyより小さい 3 < 1 FALSE
2 x <= y xyと等しいか、小さい 2 <= 2 TRUE
3 x > y xyより大きい 6 > 5 TRUE
4 x >= y xyと等しいか、大きい 4 >= 5 FALSE
5 x == y xyは等しい (2 + 3) == (4 + 1) TRUE
6 x != y xyは等しくない ((2 * 3) + 1) != (2 * (3 + 1)) TRUE

 6番目の例について少し説明する。通常の数式同様、Rも括弧()内の記述を優先的に計算する。したがって、!=左側の((2 * 3) + 1)6 + 1 = 7 であり、右側の (2 * (3 + 1))2 * 4 = 8 である。したがって、7 != 8 が判定対象となり、TRUEが返される。! 記号は、「否定」を表すために使われるもので、!= は左右が等しくないときに TRUE を返す

 上に挙げた論理演算子は基本的に数字を対象に使うが、TRUEFALSE を対象に使うものもある。それが and を表す & と or を表す| である。。& は、& を挟む左右の両側が TRUE の場合のみ TRUE を返し、| は少なくとも一方が TRUE なら TRUE を返す。

演算子 意味 結果
1 x | y xまたはy (2 + 3 == 5) | (1 * 2 == 3) TRUE
2 x & y xかつy (2 + 3 == 5) & (1 * 2 == 3) FALSE

 1番の例では、|の左側は(2 + 3 == 5)であり、TRUE である。一方、右側の(1 * 2 == 3)FALSE だ。判定対象はTRUE | FALSE となり、TRUE が返される。 2番目の例は TRUE & FALSE なので、返り値は FALSE になる。

7.2 格納とオブジェクトの作成

  • まず、123454321 * 2 を計算しよう。
  • 次に、123454321 * 3 を計算しよう。
  • 最後に、123454321 * 4 を計算しよう。

 これらの計算は簡単にできるだろう。しかし、123454321を3回入力するのが面倒だっただろう3123454321という数字をxとかaに代入し、数字の代わりに xa が使えるなら、上の計算は楽になる。ここではその方法を説明する。

 xというものに123454321という数字を入れるには、<- という演算子を使う。この演算子により、xという名のもの (オブジェクト)に123454321という数字を代入することができる。ここでは「代入」という表現を使ったが4<-の役割は代入よりも広いので、これからは「格納」という表現を使う。

 <- は、<- という2つの記号をスペースなしで入力することで作ることができる。 RStudioでは、 option + - [マイナス, ハイフン] (macOS の場合) または Alt + - (Windows の場合)で、<- が入力できる。その際、演算子の前後に半角スペースが1つずつ挿入されるので、このショートカットは必ず使うべきである。

 Rを起動した時点では、x というオブジェクトは存在しない。RStudio 右下のペインにある Environment タブを開くと、現時点では何も表示されていないはずだ。しかし、x に何かを格納することで、x というオブジェクトができる。 実際に xに、123454321を格納してみよう。

x <- 123454321  # xに123454321を格納

Environment タブに、x が登場し、格納した数字が右側に表示されていることが確認できるだろう。

 オブジェクトの中身は、オブジェクト名をそのまま入力することで表示できる。

x
[1] 123454321

 print(x) でも同じ結果が得られるが、タイプする文字数を減らしたいので xのみにする。ただし、状況やオブジェクトの型(型については後で詳しく説明する)によっては、print() を使わないと中身が表示されない(あるいは意図したとおりに見えない)場合もあるので、R Markdown やQuarto ファイルで論文などを作成していて、結果を確実に表示したい場合には print(x) とするほうが安全である。

 ちなみに、格納と同時にそのオブジェクトの中身を表示することもできる。そのためには、格納コマンド全体を() で囲む。例えば、次のようにする。

(y <- 2)  # yに2を格納し、中身を表示
[1] 2

 値が格納されたオブジェクトは計算に利用できるので、先ほどの計算は、次のようにできる。

x * 2
[1] 246908642
x * 3
[1] 370362963
x * 4
[1] 493817284

 文字列を格納することもできる。ただし、文字列は必ず ""'' で囲む必要がある。

x <- "猫の恋 やむとき閨の 朧月(芭蕉)"
x
[1] "猫の恋 やむとき閨の 朧月(芭蕉)"

 オブジェクトに格納できるのは1つの数値や文字列だけではない。複数の数値や文字列を格納することもできる。そのためには c() という関数を使う。c()c は concatenate または combine の頭文字で、複数の要素からベクトル (vector) を作るのに使われる関数である。 c() に含む要素はカンマ (,) で区切る。

# ある日の Lions の打順をベクトルに格納する
numeric_vec1  <- c(73, 6, 5, 3, 99, 10, 22, 9, 7)
numeric_vec1
[1] 73  6  5  3 99 10 22  9  7

 複数の文字列を格納することもできる。

character_vec <- c('cat', 'cheetah', 'lion',  'tiger')
character_vec
[1] "cat"     "cheetah" "lion"    "tiger"  

 ひとつひとつの要素を指定する代わりに、様々な方法でベクトルを作ることが可能である。 たとえば、seq() 関数を使うと、一連の数字からなるベクトルを作ることができる。from で数列の初項を、to で数列の最終項を指定し、by で要素間の差(第2要素は第1要素に by を加えた値になる )を指定するか、length.out で最終的にできるベクトルの要素の数を指定する。Rのベクトルの length(長さ) とは、要素の数のことなので、注意されたい。

 いくつか例を挙げる。

# 1から20までの整数。1:20 でも同じ
seq(from =  1, to = 20, by = 1)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
# 1から19までの奇数
seq(from = 11, to = 20, by = 2)
[1] 11 13 15 17 19
# 2から20までの偶数
seq(from =  2, to = 20, by = 2)
 [1]  2  4  6  8 10 12 14 16 18 20
# 降順、間隔は5
seq(from = 20, to = 1, by = -5)
[1] 20 15 10  5
# 最小値が1、最大値が100で、長さが10のベクトル
seq(from = 1, to = 100, length.out = 10)
 [1]   1  12  23  34  45  56  67  78  89 100
# 73から1つずつ数が小さくなる長さが10のベクトル
seq(from = 73, by = -1, length.out = 8)
[1] 73 72 71 70 69 68 67 66

 このように1つの関数でも指定する内容は、by になったりlength.out になったりする。bylength.outfromto などのように、関数で指定する対象になっているもののことを 仮引数 (parameter) と呼ぶ。また、by = 1 の1や、length.out = 10 の10のように、仮引数に実際に渡される値のことを実引数 (argument) と呼ぶ。特に誤解が生じないと思われる場合には、仮引数と実引数を区別せずに引数(ひきすう)と呼ぶ。 Rでは、1つの関数で使う引数の数が複数あることが多いので、仮引数を明示する習慣を身につけたほうがよい。 ただし、第1引数(関数で最初に指定する引数)として必ず入力すべきものは決められている場合がほとんどなので、第1引数の仮引数は省略されることが多い。仮引数が省略される代わりに、第1引数の実引数はほぼ必ず入力する(いくつかの例外もある)。

 seq(from = x, to = y, by = 1) の場合はより単純に x:y とすることができる。

21:30  # 21 から30までの整数
 [1] 21 22 23 24 25 26 27 28 29 30
10:1   # 10 から1までの整数(降順)
 [1] 10  9  8  7  6  5  4  3  2  1

 また、rep() 関数も便利である。例を挙げよう。

# 3が10個のベクトル
rep(3, times = 10)
 [1] 3 3 3 3 3 3 3 3 3 3
# aが3つ, bが1つ, cが2つのベクトル
rep(c('a', 'b', 'c'), times = c(3, 1, 2))
[1] "a" "a" "a" "b" "c" "c"
# C, A, T を2つずつ
rep(c('C', 'A', 'T'), each = 2)
[1] "C" "C" "A" "A" "T" "T"

 アルファベットのベクトルは、あらかじめ用意されている。

LETTERS  # 大文字
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
[20] "T" "U" "V" "W" "X" "Y" "Z"
letters  # 小文字
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z"

7.3 要素の抽出

 オブジェクト名(ベクトル)の後に [抽出する要素のインデクス] を付けると、ベクトルの特定の要素を抽出することができる。ちなみに [ は関数である。Console にhelp("[") と打てば、これが Extract と言う名前の関数であることがわかる(help("[]") ではないので注意)。

 ベクトルの要素を取り出してみよう。Rのインデクスは、他の多くのプログラミング言語(例えば、C, C++, Pythonなど)とは異なり「1」から始まるので注意されたい。

# numeric_vec1の5番目の要素を抽出
numeric_vec1[5]
[1] 99
# numeric_vec1の2, 4, 6番目の要素を抽出
numeric_vec1[c(2, 4, 6)]
[1]  6  3 10
# numeric_vec1の1番目と4番目「以外」の要素を抽出
numeric_vec1[-c(1, 4)]
[1]  6  5 99 10 22  9  7
# numeric_vec1の5番目から7番目の要素を抽出
numeric_vec1[5:7]
[1] 99 10 22

 c():だけでなく、seq()も使える。

numeric_vec2 <- 1:20
# numeric_vec2 の奇数番目の要素を抽出
numeric_vec2[seq(1, 20, by = 2)]
 [1]  1  3  5  7  9 11 13 15 17 19

 さらに、TRUEFALSEを使うこともできる。この場合、抽出したい要素の場所を指定するのではなく、それぞれの場所について抽出する (TRUE) か、しない (FALSE) かを指定する。たとえば、character_vecから1, 3, 4番目の要素を抽出するなら、[c(TRUE, FALSE, TRUE, TRUE)]と指定する。

character_vec[c(TRUE, FALSE, TRUE, TRUE)]
[1] "cat"   "lion"  "tiger"

 TRUEFALSEが使えるので、論理演算子を[]の中で使うこともできる。たとえば、numeric_vec1の各要素が偶数かどうかを判定するためには、インデックスが2で割り切れるかどうか(2で割った余りが0かどうか)を確認すれば良い。

(numeric_vec1 %% 2) == 0  # 偶数かどうかの判定
[1] FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE

これを利用すれば、numeric_vec1から偶数のみを抽出できる。

numeric_vec1[(numeric_vec1 %% 2) == 0]
[1]  6 10 22

 [ と格納(代入)を組み合わせれば、「ベクトルの一部の要素を書き換える」ことができる。たとえば、numeric_vec1の2番目の要素は5だが、これを100に書き換えたい場合、置換したい要素の場所を[]で指定し、<-で代入すれば良い。

numeric_vec1[2] <- 100
numeric_vec1
[1]  73 100   5   3  99  10  22   9   7

 複数の要素を置換することもできる。たとえば、偶数を全て0に置換したい場合、以下のようにする。

numeric_vec1[(numeric_vec1 %% 2) == 0] <- 0
numeric_vec1
[1] 73  0  5  3 99  0  0  9  7

  1. Mac では、command + shift + N、Windows では Ctrl + Shift + N のショートカットが使える。↩︎

  2. 電卓として使う程度なら、Consoleに直接入力してもかまわない。↩︎

  3. 反復作業が面倒だと感じたときは、どうやったらもっと楽ができるか考えよう。それがプログラミング上達の秘訣である。↩︎

  4. 代入の代わりに「付値」と言うこともある。↩︎