2 基礎

今回は,前回の練習問題の解答について解説しつつ,Rの基礎を学びます。 とくにデータの型と構造について理解しておかなければなりません。

Rを使うとき,常に,「このコードを実行するとこうなるはずだ」と予想してください。 予想通りの結果が得られた場合,自分の予想は正しかったことが確かめられます。 予想とは異なる結果が得られた場合,2つの原因が考えられます。

  1. 予想の元となった自分の考えが間違っていた。
  2. コードが間違っている。

どちらが原因で予想と異なる結果が得られたかを考えてください。 前者の場合は自分の考えを改める必要があります。 Rの学習は,この予想と結果を合わせていく作業です。 常に,予想した結果が得られなければなりません。

2.1 データの型

データの型には,数値,文字列,ファクター(因子),論理値があります。 以下のどれかのコマンドを使って,そのデータの型を知ることができます。

typeof()
mode()
class()

ただし,常に意識するというよりは,エラーの原因追及(バグフィックス)時に必要な知識です。 このため,自分が書いたスクリプトにバグが入らないようにしたいなら,このデータの型を意識しておかなければなりません。 データの型には次の種類があります。

  1. 実数
  2. 整数
  3. 文字列
  4. ファクター
  5. 論理値

2.1.1 数値

実数と整数はいずれも数値で,区別しなくても困りません。 数値は計算できます。 任意のオブジェクトが数値かどうかを判定したいときは,is.double() または is.numeric() を用います。

x <- 10
is.double(x)
## [1] TRUE
# is.numeric(x)

返り値の TRUE は真という意味で,判定(知りたいこと)が真のときに TRUE が返ってきます。

Rではデフォルトで数値は実数として扱われます。 数字を扱うにあたって,それ以上のことを考える必要はありません。 もし整数として明示的に扱いたい場合は,次の関係を知っておいてください。

x <- 10
is.integer(x)
## [1] FALSE
x <- 10L
is.integer(x)
## [1] TRUE
x <- as.integer(10)
is.integer(x)
## [1] TRUE

また,整数は整数として意識的に維持しなければ,容易に実数に変化します。

10L + 2; is.integer(10L + 2)
## [1] 12
## [1] FALSE
10L + 2L; is.integer(10L + 2L)
## [1] 12
## [1] TRUE

多くの場合,数値を扱いたい場合は,整数ではなく,実数を使って問題ありません。

2.1.2 文字列

文字列は文字として表現されるもので,"" で括って表記します。

c("a", "あ", 'b')
## [1] "a"  "あ" "b"

多くの場合,""'' で代替できます。 ただし,Rの返り値は必ず "" で括られますので,'' ではなく "" を使うようにしてください。

c("a", "あ", "b")
## [1] "a"  "あ" "b"

文字列の中に " を入れたい場合に '' を使うとよいです。

x <- '"あ"'
x
## [1] "\"あ\""

返り値がおかしいですね。 いや,これでいいのです。 \ のことをエスケープシーケンスと呼びます。

エスケープシーケンスを使うと,文字列は常に "" で括れます。

x <- "\"\""
x
## [1] "\"あ\""

文字列をくっつける関数に paste() があります。 次のように使います。

x <- "愛媛"
y <- "県"
paste(x, y)
## [1] "愛媛 県"

デフォルトでは結合部分に半角スペースが入ります。 結合部分に入れる文字は,引数 sep で指定します。 何も入れたくない場合は,次のようにします。

paste(x, y, sep = "")
## [1] "愛媛県"

数値を文字列に変換する場合は,as.character() を使います。 ただし,paste() の方が便利なため,paste() を頻繁に使うことになるでしょう。 例えば次のようにします。

paste(2000:2010, "年", sep = "")
##  [1] "2000年" "2001年" "2002年" "2003年" "2004年" "2005年" "2006年" "2007年"
##  [9] "2008年" "2009年" "2010年"

paste() は文字列を繋げる関数です。 引数には文字列を取りますので,引数に数値がある場合は,勝手に文字列に変換されます。

2.1.3 ファクター

ファクターは見た目は文字列ですが,以下の特徴があります。

  • 取り得る値の数が有限である。
  • グループ分けに使える。
  • 値に順番のようなものがある。

例えば,学生の成績は「秀」「優」「良」「可」「不可」で表現されます。 あるいは,「S」「A」「B」「C」「D」といった表現もあります。 これらの文字列には順番があります。 「秀」は「優」より上,「優」は「良」より上です。

また,「愛媛県」は文字列で,一見順番は関係なさそうですが,都道府県コードというものが割り振られており,都道府県別に並べるとき,愛媛県は38番目に表示するというルールがあります。 「北海道」が01で,「沖縄県」が47です。 他に,アンケート調査の選択のある問に対する解答として,「強くそう思う」「ややそう思う」「どちらでもない」「あまりそう思わない」「まったくそう思わない」といったデータがあり得ます。

こうしたデータを扱う場合,ファクターを文字列として考えていると,思い通りの表示にならなかったり,処理できずエラーが返ってくることがあります。

次のデータがあったとします。

grade <- c("優", "良", "可", "良", "良", "不可", "秀", "優", "可", "良")
grade
##  [1] "優"   "良"   "可"   "良"   "良"   "不可" "秀"   "優"   "可"   "良"

この変数 grade に順番のようなものを持たせるためには,次のようにします。

grade2 <- factor(grade, levels = c("不可", "可", "良", "優", "秀"))
grade2
##  [1] 優   良   可   良   良   不可 秀   優   可   良  
## Levels: 不可 可 良 優 秀

ファクターの返り値に順番が Levels として表記されます。 この Levels はファクターに付けられたラベルであり,次のコマンドで取り出せます。

levels(grade2)
## [1] "不可" "可"   "良"   "優"   "秀"

ファクターのラベルを変更すれば,ファクターの各要素の値も変わります。

levels(grade2) <- c("D", "C", "B", "A", "S")
grade2
##  [1] A B C B B D S A C B
## Levels: D C B A S

ファクターを文字列に変換すれば,ラベル(順番の情報)は失われます。

as.character(grade2)
##  [1] "A" "B" "C" "B" "B" "D" "S" "A" "C" "B"

上述の説明は順番のようなものの存在を暗黙裏に扱っており,通常の使用ではこれで問題ありません。 もし明示的に順番を扱いたい場合は,次のようにする必要があります。

factor(grade, levels = c("不可", "可", "良", "優", "秀"), ordered = TRUE)
##  [1] 優   良   可   良   良   不可 秀   優   可   良  
## Levels: 不可 < 可 < 良 < 優 < 秀

また,上述のアンケート調査の例では,実際は,ファクターではなく,数値に変換して分析することもあります。

x <- factor(grade, levels = c("不可", "可", "良", "優", "秀"))
as.double(x)
##  [1] 4 3 2 3 3 1 5 4 2 3

2.1.4 論理値

オブジェクトの状態を表すものに,TRUEFALSE があります。 日本語では,TRUE は真で,FALSE で偽と表現します。 これまで関数の引数として登場しました。

TRUET と省略でき,FALSEF と省略できることを知っておいてください。 ただし,自分では TF を使わないでください。 複雑なコードのときに,TF よりも,TRUEFALSE の方が分かりやすいからです。 もしどこかでTF を見かけたら,頭の中でそれぞれ TRUEFALSE に置き換えてください。 なお,Truetrue ではなく,必ず大文字を使ってください。

論理値は,真偽を確かめたいときに関数の返り値として用いられます。 このとき,論理値が計算できることを知っておくと役に立つ場面がある。

x <- rep(TRUE, 10)
x
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
sum(x)
## [1] 10

この例のように,TRUE のベクトルをわざわざ生成することは実際はあまりありませんが,比較演算子を用いた判定の返り値を計算に利用することはよくあります。 このとき,sum()TRUE の数に一致します。 つまり,TRUE の数を数えていると理解してもよいです。 実際には,R内部で TRUE は数値の 1 に変換され,FALSE は数値の 0 に変換された後,sum() が適用されています。

2.2 データの構造

データの構造には以下の種類のものがあります。

  1. ベクトル
  2. 行列
  3. データフレーム
  4. リスト

2.2.1 ベクトル

ベクトルは,c() で作成します。

c(10, 12, 15, 20)
## [1] 10 12 15 20

seq() などの関数のように,返り値がベクトルとなるものもあります。

ベクトルの四則演算はベクトルを返します。

c(10, 12, 15, 20) * 5
## [1]  50  60  75 100

列ベクトルか行ベクトルかはあまり気にする必要はありません。 ベクトルの転置は次のようにします。

x <- 1990:2020
x
##  [1] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004
## [16] 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
## [31] 2020
t(x)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## [1,] 1990 1991 1992 1993 1994 1995 1996 1997 1998  1999  2000  2001  2002  2003
##      [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26]
## [1,]  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015
##      [,27] [,28] [,29] [,30] [,31]
## [1,]  2016  2017  2018  2019  2020

このことから,xx を転置した t(x) は違うことが分かります。

ベクトルは数値である必要はなく,文字列のベクトルも作成できます。

c("テニス", "バレーボール", "野球", "サッカー")
## [1] "テニス"       "バレーボール" "野球"         "サッカー"

ただし,ベクトルの各要素の型は同じでなければなりません。 例えば,数値と文字列を混ぜた場合,そのベクトルは文字列になります。

x <- c(1, "テニス", 3)
x[1] + x[3]
## Error in x[1] + x[3]: 二項演算子の引数が数値ではありません

文字列は,たとえ見た目が数値であったとしても,計算できません。 文字列は必ず "" で括られています。

x
## [1] "1"      "テニス" "3"

ただし,文字列の中が数値の場合,その文字列は数値に変換できます。 文字列を数値に変換する場合は,as.double() を用います。

as.double(x[1]) + as.double(x[3])
## [1] 4

次のように,as.numeric() でも同じ結果が得られますが,文字列を数値に変換する場合,as.double() を使う方が(おそらく)正当なやり方です。

as.numeric(x[1]) + as.numeric(x[3])
## [1] 4

2.2.1.1 欠損値

データがない部分のことを欠損値と言います。 数値の欠損値は NA で表します。 例えば,アンケート調査を実施して,ある回答者がある問の選択問題の解答をしていない場合,そこに - を入力してはいけません。 そこには,何も入力しないのが正しいデータ作成の方法です。 Microsoft Excelでデータ入力する場合は,そのセルには何も入力せずに次の入力に移ってください。 ただし,Rでデータ作成する場合,次のようにするとエラーが返ってきます。

c(1, 2, , 4, 5)

このため,欠損値には NA と書いてください。

c(1, 2, NA, 4, 5)

CSVファイルなどをRで読み込むときに欠損値があると,その部分がデフォルトでは NA に置き換わります。 ここで,次のようにするとエラーが返ってきます。

c(1, 2, -, 4, 5)

また,次のようにすると全体が文字列になります。

c(1, 2, "-", 4, 5)

一方,アンケート調査で,文章で回答してもらう問に対して無回答だった場合,そこに "" を入力してください。 Microsoft Excelでデータ入力する場合は,そのセルには何も入力せずに次の入力に移ってください。 CSVファイルなどをRで読み込むときに欠損値があると,その部分がデフォルトでは "" に置き換わります。

c("テニスが好き", "バレーボールをやってた", NA, "野球が苦手", "サッカーが得意")

これだとエラーは返ってきませんが,あまりよい方法ではありません。 この場合,次のようにしてください。

c("テニスが好き", "バレーボールをやってた", "", "野球が苦手", "サッカーが得意")

NA に似たものに NULL があります。 NULL はデータの欠損値には使いません。 NULL には例えば次のような使い方があります。

x <- NULL

2.2.2 名前付きベクトル

名前付きベクトルというものがあります。 辞書のような働きをします。

あまり使わないので,ここでは説明を省略します。

2.2.3 行列

Rは行列計算が高速であることが特徴のひとつです。 また,ここには書きませんが,行列を用いた数式の表記は簡潔です。

行列は以下のようにして作成します。

matrix(1:12, nrow = 4)
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

nrow は行の数です。 行列の要素の数は,nrow の値で割り切れなければなりません。 列の数 ncol を指定しても構いません。

行列の外側の []で囲まれた部分に注目してください。 [], と数字によって,そこが行列の何行目か,あるいは,何列目かが分かります。 [行, 列] という関係になっています。

行列はMicrosoft Excelでよく見る表に似ていますが,そうではなく,数学で出てくる行列そのものだと理解してください。 行列の要素は [] を用いて取り出します。 例えば,1行2列の要素は次のようにして取り出します。

x <- matrix(1:12, nrow = 4)
x[1, 2]
## [1] 5

行は次のようにして取り出します。

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

列は次のようにして取り出します。

x[, 3]
## [1]  9 10 11 12

この法則に従って,スペースを入れることを忘れないようにしてください(スペースを入れなくてもエラーは出ません)。

2.2.3.1 Tips

行列はベクトルを折り畳んだようなものであると理解しておくと役に立つことがあります。 次の結果を比較して,行列がベクトルであることを理解してください。

matrix(1:12, nrow = 4)[5]
## [1] 5
matrix(1:12, nrow = 4, byrow = TRUE)[5]
## [1] 2

ただし,通常のデータ分析で行列を扱う機会は少ないかもしれません。 次のコマンドが FALSE を返すように,厳密にはベクトルではありません。

is.vector(matrix(1:12, nrow = 4))
## [1] FALSE

しかし,ベクトルであるかのように動作することがあります。

2.2.4 データフレーム

データフレームはMicrosoft Excelでよく見る表に似ており,そのようなものだと理解してください。 read.csv() で読み込んだオブジェクトは,データフレームです。

データフレームには行と列が存在する点では,行列に似ています。 しかしながら,行列とは違い,各列を異なる型にすることができることから,行列よりも柔軟なデータ構造となります。 それぞれの列は同じ型でなければなりません。

Rには最初から多くのデータセットが使える状態になっています。 サンプルとしてよく使われるデータセットに iris があります。 iris の中身は,iris と入力するだけで表示されます。

iris

データフレームの全体を表示させることなく,データフレームの構造を知りたいときは,最初の数行を表示させるコマンドを使うのが便利です。

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

同じように,最後の数行を表示させることもできます。

tail(iris)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica

途中の行を表示させたい場合は,行番号を指定します。

iris[100:105, ]
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 100          5.7         2.8          4.1         1.3 versicolor
## 101          6.3         3.3          6.0         2.5  virginica
## 102          5.8         2.7          5.1         1.9  virginica
## 103          7.1         3.0          5.9         2.1  virginica
## 104          6.3         2.9          5.6         1.8  virginica
## 105          6.5         3.0          5.8         2.2  virginica

iris は変数であり,次のコマンドで確かめられるように,データフレームです。

is.data.frame(iris)
## [1] TRUE

データフレームの構造を知りたい場合は,次のようにします。

str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

データフレームを90度左に回転して反転させた表示になっていることに気づいたのではないでしょうか。 iris の1列目 Sepal.Length が一番上に表示されています。 iris の2列目は2行目というように順番に表示されます。

また,データフレームの列ごとにデータの型(の省略形)が表示されることが分かります。 すなわち,データフレームのどの列もデータの型は1つしか認められていません。 違う型の行を追加しようとすると,エラーになるか警告が表示されます。

行の数と列の数は次のコマンドで取得できます。

dim(iris)
## [1] 150   5

この情報は,str(iris) の1行目に表示されるものと同じです。

なお,データフレームを Excel のように表示したい場合は,次のコマンドを実行します。

View(iris)

macOS では XQuartz が起動します。 R に慣れるまで,データフレームを Excel のような表示にした方が分かりやすい場合は View() を使ってください。 そのうち,必要なくなると思います。

2.2.4.1 データフレームの列

データフレームそのものを分析に使うこともできますが,必要な列を取り出して,分析に使うのが一般的です。 そこで,データフレームの列を取り出す方法をいくつか説明します。 なお,データフレームの進化したものに,tibble があります。 tibbleはデータフレームとほとんど同じように扱えますが,データフレームとは挙動が若干異なりますので,違うものと考えてください。 ちなみに,read_excel() で読み込んだオブジェクトは,tibbleです。 tibbleは Tidyverse の一部分(最も重要な部分)を構成します。

データフレームの列を取り出す場合,左から何列目であるかを数値で指定することができます。 次のコマンドにより,データフレームの列をベクトルとして取り出すことができます。

iris[, 1]
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
##  [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
##  [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3
##  [58] 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6
##  [77] 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6
##  [96] 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7
## [115] 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4
## [134] 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

返り値をデータフレームとして保ちたければ,次のようにします。

iris[1]
##     Sepal.Length
## 1            5.1
## 2            4.9
## 3            4.7
## 4            4.6
## 5            5.0
## 6            5.4
## 7            4.6
## 8            5.0
## 9            4.4
## 10           4.9
## 11           5.4
## 12           4.8
## 13           4.8
## 14           4.3
## 15           5.8
## 16           5.7
## 17           5.4
## 18           5.1
## 19           5.7
## 20           5.1
## 21           5.4
## 22           5.1
## 23           4.6
## 24           5.1
## 25           4.8
## 26           5.0
## 27           5.0
## 28           5.2
## 29           5.2
## 30           4.7
## 31           4.8
## 32           5.4
## 33           5.2
## 34           5.5
## 35           4.9
## 36           5.0
## 37           5.5
## 38           4.9
## 39           4.4
## 40           5.1
## 41           5.0
## 42           4.5
## 43           4.4
## 44           5.0
## 45           5.1
## 46           4.8
## 47           5.1
## 48           4.6
## 49           5.3
## 50           5.0
## 51           7.0
## 52           6.4
## 53           6.9
## 54           5.5
## 55           6.5
## 56           5.7
## 57           6.3
## 58           4.9
## 59           6.6
## 60           5.2
## 61           5.0
## 62           5.9
## 63           6.0
## 64           6.1
## 65           5.6
## 66           6.7
## 67           5.6
## 68           5.8
## 69           6.2
## 70           5.6
## 71           5.9
## 72           6.1
## 73           6.3
## 74           6.1
## 75           6.4
## 76           6.6
## 77           6.8
## 78           6.7
## 79           6.0
## 80           5.7
## 81           5.5
## 82           5.5
## 83           5.8
## 84           6.0
## 85           5.4
## 86           6.0
## 87           6.7
## 88           6.3
## 89           5.6
## 90           5.5
## 91           5.5
## 92           6.1
## 93           5.8
## 94           5.0
## 95           5.6
## 96           5.7
## 97           5.7
## 98           6.2
## 99           5.1
## 100          5.7
## 101          6.3
## 102          5.8
## 103          7.1
## 104          6.3
## 105          6.5
## 106          7.6
## 107          4.9
## 108          7.3
## 109          6.7
## 110          7.2
## 111          6.5
## 112          6.4
## 113          6.8
## 114          5.7
## 115          5.8
## 116          6.4
## 117          6.5
## 118          7.7
## 119          7.7
## 120          6.0
## 121          6.9
## 122          5.6
## 123          7.7
## 124          6.3
## 125          6.7
## 126          7.2
## 127          6.2
## 128          6.1
## 129          6.4
## 130          7.2
## 131          7.4
## 132          7.9
## 133          6.4
## 134          6.3
## 135          6.1
## 136          7.7
## 137          6.3
## 138          6.4
## 139          6.0
## 140          6.9
## 141          6.7
## 142          6.9
## 143          5.8
## 144          6.8
## 145          6.7
## 146          6.7
## 147          6.3
## 148          6.5
## 149          6.2
## 150          5.9

次のようにすると,左から1列目をベクトルとして取り出せます。

iris[[1]]
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
##  [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
##  [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3
##  [58] 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6
##  [77] 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6
##  [96] 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7
## [115] 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4
## [134] 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

このことから,iris[, 1]iris[[1]] は同じ結果が得られることが分かります。

データフレームの左から何列目かという情報は,対話的にRを使う場合は便利なときもありますが,データフレームの構造を正確に把握しておかなければならず,またデータフレームの列が多くなった場合,何列目かをわざわざ数えなければなりません。 こうした作業は面倒だということもありますが,それ以上に,間違う可能性があります。 列を取り出す際,データフレームの左から何列目かという情報ではなく,列名で指定する方が間違いが少なくなるでしょう。 irisSepal.Length 列を取り出したい場合は,次のように $ で繋ぎます。

iris$Sepal.Length
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
##  [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
##  [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3
##  [58] 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6
##  [77] 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6
##  [96] 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7
## [115] 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4
## [134] 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

列名が日本語の場合など,次のようにしなければエラーが返ってくることがあります。

iris$`Sepal.Length`

日本語の他にも,列名に () が使われている場合は,`` で括らなければエラーが返ってきます。 返り値をデータフレームとして保ちたければ,次のようにします。

iris["Sepal.Length"]
##     Sepal.Length
## 1            5.1
## 2            4.9
## 3            4.7
## 4            4.6
## 5            5.0
## 6            5.4
## 7            4.6
## 8            5.0
## 9            4.4
## 10           4.9
## 11           5.4
## 12           4.8
## 13           4.8
## 14           4.3
## 15           5.8
## 16           5.7
## 17           5.4
## 18           5.1
## 19           5.7
## 20           5.1
## 21           5.4
## 22           5.1
## 23           4.6
## 24           5.1
## 25           4.8
## 26           5.0
## 27           5.0
## 28           5.2
## 29           5.2
## 30           4.7
## 31           4.8
## 32           5.4
## 33           5.2
## 34           5.5
## 35           4.9
## 36           5.0
## 37           5.5
## 38           4.9
## 39           4.4
## 40           5.1
## 41           5.0
## 42           4.5
## 43           4.4
## 44           5.0
## 45           5.1
## 46           4.8
## 47           5.1
## 48           4.6
## 49           5.3
## 50           5.0
## 51           7.0
## 52           6.4
## 53           6.9
## 54           5.5
## 55           6.5
## 56           5.7
## 57           6.3
## 58           4.9
## 59           6.6
## 60           5.2
## 61           5.0
## 62           5.9
## 63           6.0
## 64           6.1
## 65           5.6
## 66           6.7
## 67           5.6
## 68           5.8
## 69           6.2
## 70           5.6
## 71           5.9
## 72           6.1
## 73           6.3
## 74           6.1
## 75           6.4
## 76           6.6
## 77           6.8
## 78           6.7
## 79           6.0
## 80           5.7
## 81           5.5
## 82           5.5
## 83           5.8
## 84           6.0
## 85           5.4
## 86           6.0
## 87           6.7
## 88           6.3
## 89           5.6
## 90           5.5
## 91           5.5
## 92           6.1
## 93           5.8
## 94           5.0
## 95           5.6
## 96           5.7
## 97           5.7
## 98           6.2
## 99           5.1
## 100          5.7
## 101          6.3
## 102          5.8
## 103          7.1
## 104          6.3
## 105          6.5
## 106          7.6
## 107          4.9
## 108          7.3
## 109          6.7
## 110          7.2
## 111          6.5
## 112          6.4
## 113          6.8
## 114          5.7
## 115          5.8
## 116          6.4
## 117          6.5
## 118          7.7
## 119          7.7
## 120          6.0
## 121          6.9
## 122          5.6
## 123          7.7
## 124          6.3
## 125          6.7
## 126          7.2
## 127          6.2
## 128          6.1
## 129          6.4
## 130          7.2
## 131          7.4
## 132          7.9
## 133          6.4
## 134          6.3
## 135          6.1
## 136          7.7
## 137          6.3
## 138          6.4
## 139          6.0
## 140          6.9
## 141          6.7
## 142          6.9
## 143          5.8
## 144          6.8
## 145          6.7
## 146          6.7
## 147          6.3
## 148          6.5
## 149          6.2
## 150          5.9

このとき,"" をつけなければエラーが返ってきます。 ここで,"" の中は文字列として扱われるため,`` で括る必要はありません。

iris[Sepal.Length]
## Error: オブジェクト 'Sepal.Length' がありません

このとき,Sepal.Length という名前の変数(オブジェクト)を探しに行き,それがないためエラーを返しています。 次のようにすると,ベクトルとして取り出せます。

iris[["Sepal.Length"]]
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
##  [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
##  [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3
##  [58] 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6
##  [77] 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6
##  [96] 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7
## [115] 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4
## [134] 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

ここで,列名を知るにはどうすればよいでしょうか。 str() で知ることができますが,str() だと情報が多いです。 データフレームの列名のみを得るには,次のコマンドを用います。

names(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

これは次のようにしても同じです。

colnames(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

次に,複数の列を取り出してみます。 irisSepal.Length 列と Sepal.Width 列を取り出すには,次のようにします。

iris[c("Sepal.Length", "Sepal.Width")]
##     Sepal.Length Sepal.Width
## 1            5.1         3.5
## 2            4.9         3.0
## 3            4.7         3.2
## 4            4.6         3.1
## 5            5.0         3.6
## 6            5.4         3.9
## 7            4.6         3.4
## 8            5.0         3.4
## 9            4.4         2.9
## 10           4.9         3.1
## 11           5.4         3.7
## 12           4.8         3.4
## 13           4.8         3.0
## 14           4.3         3.0
## 15           5.8         4.0
## 16           5.7         4.4
## 17           5.4         3.9
## 18           5.1         3.5
## 19           5.7         3.8
## 20           5.1         3.8
## 21           5.4         3.4
## 22           5.1         3.7
## 23           4.6         3.6
## 24           5.1         3.3
## 25           4.8         3.4
## 26           5.0         3.0
## 27           5.0         3.4
## 28           5.2         3.5
## 29           5.2         3.4
## 30           4.7         3.2
## 31           4.8         3.1
## 32           5.4         3.4
## 33           5.2         4.1
## 34           5.5         4.2
## 35           4.9         3.1
## 36           5.0         3.2
## 37           5.5         3.5
## 38           4.9         3.6
## 39           4.4         3.0
## 40           5.1         3.4
## 41           5.0         3.5
## 42           4.5         2.3
## 43           4.4         3.2
## 44           5.0         3.5
## 45           5.1         3.8
## 46           4.8         3.0
## 47           5.1         3.8
## 48           4.6         3.2
## 49           5.3         3.7
## 50           5.0         3.3
## 51           7.0         3.2
## 52           6.4         3.2
## 53           6.9         3.1
## 54           5.5         2.3
## 55           6.5         2.8
## 56           5.7         2.8
## 57           6.3         3.3
## 58           4.9         2.4
## 59           6.6         2.9
## 60           5.2         2.7
## 61           5.0         2.0
## 62           5.9         3.0
## 63           6.0         2.2
## 64           6.1         2.9
## 65           5.6         2.9
## 66           6.7         3.1
## 67           5.6         3.0
## 68           5.8         2.7
## 69           6.2         2.2
## 70           5.6         2.5
## 71           5.9         3.2
## 72           6.1         2.8
## 73           6.3         2.5
## 74           6.1         2.8
## 75           6.4         2.9
## 76           6.6         3.0
## 77           6.8         2.8
## 78           6.7         3.0
## 79           6.0         2.9
## 80           5.7         2.6
## 81           5.5         2.4
## 82           5.5         2.4
## 83           5.8         2.7
## 84           6.0         2.7
## 85           5.4         3.0
## 86           6.0         3.4
## 87           6.7         3.1
## 88           6.3         2.3
## 89           5.6         3.0
## 90           5.5         2.5
## 91           5.5         2.6
## 92           6.1         3.0
## 93           5.8         2.6
## 94           5.0         2.3
## 95           5.6         2.7
## 96           5.7         3.0
## 97           5.7         2.9
## 98           6.2         2.9
## 99           5.1         2.5
## 100          5.7         2.8
## 101          6.3         3.3
## 102          5.8         2.7
## 103          7.1         3.0
## 104          6.3         2.9
## 105          6.5         3.0
## 106          7.6         3.0
## 107          4.9         2.5
## 108          7.3         2.9
## 109          6.7         2.5
## 110          7.2         3.6
## 111          6.5         3.2
## 112          6.4         2.7
## 113          6.8         3.0
## 114          5.7         2.5
## 115          5.8         2.8
## 116          6.4         3.2
## 117          6.5         3.0
## 118          7.7         3.8
## 119          7.7         2.6
## 120          6.0         2.2
## 121          6.9         3.2
## 122          5.6         2.8
## 123          7.7         2.8
## 124          6.3         2.7
## 125          6.7         3.3
## 126          7.2         3.2
## 127          6.2         2.8
## 128          6.1         3.0
## 129          6.4         2.8
## 130          7.2         3.0
## 131          7.4         2.8
## 132          7.9         3.8
## 133          6.4         2.8
## 134          6.3         2.8
## 135          6.1         2.6
## 136          7.7         3.0
## 137          6.3         3.4
## 138          6.4         3.1
## 139          6.0         3.0
## 140          6.9         3.1
## 141          6.7         3.1
## 142          6.9         3.1
## 143          5.8         2.7
## 144          6.8         3.2
## 145          6.7         3.3
## 146          6.7         3.0
## 147          6.3         2.5
## 148          6.5         3.0
## 149          6.2         3.4
## 150          5.9         3.0

データフレームから複数列を取り出す場合,返り値はベクトルではなく,必ずデータフレームになります。 このため,$[[]] は使えません。

ちなみに,以下のような表記法は,返り値としてベクトルが欲しい場合にもデータフレームが欲しい場合にも使えるので,便利です。 しかしながら,tibbleでこの方法は使えないため,残念ながら,こうした表記法は過去のものとなりました。

iris[, "Sepal.Length"]
iris[, "Sepal.Length", drop = FALSE]
iris[, c("Sepal.Length", "Sepal.Width")]

2.2.4.2 データフレームの列

データフレームは,data.frame() で作成します。 データフレーム作成時に注意すべきことは,各列の長さを合わせるということです。 各列の長さが揃わないときは,短い列を繰り返します。 この繰り返しが整数倍でない場合,エラーが返ってきます。

data.frame(year = 1991:2020, value1 = 1:30, value2 = NA, value3 = c("東", "西", "南"), value4 = 1:5)

2.2.5 リスト

リストはさまざまな変数を入れることのできる,引き出しだと説明されることがあります。 さまざまな変数をリストに入れることができます。 データフレームのように,各要素の数を揃える必要はありません。 Pythonでいう辞書のようなものです。

リストはさまざまな形を取りますが,実践的には,複数のデータフレームを要素とできる点が便利です。

x <- list()

また,関数の返り値がリストとなることがあります。 例えば,データフレームをある列(ファクター)に従って分割したい場合,split() を用います。

x <- split(iris, iris$Species)
x[[1]]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1           5.1         3.5          1.4         0.2  setosa
## 2           4.9         3.0          1.4         0.2  setosa
## 3           4.7         3.2          1.3         0.2  setosa
## 4           4.6         3.1          1.5         0.2  setosa
## 5           5.0         3.6          1.4         0.2  setosa
## 6           5.4         3.9          1.7         0.4  setosa
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa
## 11          5.4         3.7          1.5         0.2  setosa
## 12          4.8         3.4          1.6         0.2  setosa
## 13          4.8         3.0          1.4         0.1  setosa
## 14          4.3         3.0          1.1         0.1  setosa
## 15          5.8         4.0          1.2         0.2  setosa
## 16          5.7         4.4          1.5         0.4  setosa
## 17          5.4         3.9          1.3         0.4  setosa
## 18          5.1         3.5          1.4         0.3  setosa
## 19          5.7         3.8          1.7         0.3  setosa
## 20          5.1         3.8          1.5         0.3  setosa
## 21          5.4         3.4          1.7         0.2  setosa
## 22          5.1         3.7          1.5         0.4  setosa
## 23          4.6         3.6          1.0         0.2  setosa
## 24          5.1         3.3          1.7         0.5  setosa
## 25          4.8         3.4          1.9         0.2  setosa
## 26          5.0         3.0          1.6         0.2  setosa
## 27          5.0         3.4          1.6         0.4  setosa
## 28          5.2         3.5          1.5         0.2  setosa
## 29          5.2         3.4          1.4         0.2  setosa
## 30          4.7         3.2          1.6         0.2  setosa
## 31          4.8         3.1          1.6         0.2  setosa
## 32          5.4         3.4          1.5         0.4  setosa
## 33          5.2         4.1          1.5         0.1  setosa
## 34          5.5         4.2          1.4         0.2  setosa
## 35          4.9         3.1          1.5         0.2  setosa
## 36          5.0         3.2          1.2         0.2  setosa
## 37          5.5         3.5          1.3         0.2  setosa
## 38          4.9         3.6          1.4         0.1  setosa
## 39          4.4         3.0          1.3         0.2  setosa
## 40          5.1         3.4          1.5         0.2  setosa
## 41          5.0         3.5          1.3         0.3  setosa
## 42          4.5         2.3          1.3         0.3  setosa
## 43          4.4         3.2          1.3         0.2  setosa
## 44          5.0         3.5          1.6         0.6  setosa
## 45          5.1         3.8          1.9         0.4  setosa
## 46          4.8         3.0          1.4         0.3  setosa
## 47          5.1         3.8          1.6         0.2  setosa
## 48          4.6         3.2          1.4         0.2  setosa
## 49          5.3         3.7          1.5         0.2  setosa
## 50          5.0         3.3          1.4         0.2  setosa
x[[names(x)[2]]]
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 51           7.0         3.2          4.7         1.4 versicolor
## 52           6.4         3.2          4.5         1.5 versicolor
## 53           6.9         3.1          4.9         1.5 versicolor
## 54           5.5         2.3          4.0         1.3 versicolor
## 55           6.5         2.8          4.6         1.5 versicolor
## 56           5.7         2.8          4.5         1.3 versicolor
## 57           6.3         3.3          4.7         1.6 versicolor
## 58           4.9         2.4          3.3         1.0 versicolor
## 59           6.6         2.9          4.6         1.3 versicolor
## 60           5.2         2.7          3.9         1.4 versicolor
## 61           5.0         2.0          3.5         1.0 versicolor
## 62           5.9         3.0          4.2         1.5 versicolor
## 63           6.0         2.2          4.0         1.0 versicolor
## 64           6.1         2.9          4.7         1.4 versicolor
## 65           5.6         2.9          3.6         1.3 versicolor
## 66           6.7         3.1          4.4         1.4 versicolor
## 67           5.6         3.0          4.5         1.5 versicolor
## 68           5.8         2.7          4.1         1.0 versicolor
## 69           6.2         2.2          4.5         1.5 versicolor
## 70           5.6         2.5          3.9         1.1 versicolor
## 71           5.9         3.2          4.8         1.8 versicolor
## 72           6.1         2.8          4.0         1.3 versicolor
## 73           6.3         2.5          4.9         1.5 versicolor
## 74           6.1         2.8          4.7         1.2 versicolor
## 75           6.4         2.9          4.3         1.3 versicolor
## 76           6.6         3.0          4.4         1.4 versicolor
## 77           6.8         2.8          4.8         1.4 versicolor
## 78           6.7         3.0          5.0         1.7 versicolor
## 79           6.0         2.9          4.5         1.5 versicolor
## 80           5.7         2.6          3.5         1.0 versicolor
## 81           5.5         2.4          3.8         1.1 versicolor
## 82           5.5         2.4          3.7         1.0 versicolor
## 83           5.8         2.7          3.9         1.2 versicolor
## 84           6.0         2.7          5.1         1.6 versicolor
## 85           5.4         3.0          4.5         1.5 versicolor
## 86           6.0         3.4          4.5         1.6 versicolor
## 87           6.7         3.1          4.7         1.5 versicolor
## 88           6.3         2.3          4.4         1.3 versicolor
## 89           5.6         3.0          4.1         1.3 versicolor
## 90           5.5         2.5          4.0         1.3 versicolor
## 91           5.5         2.6          4.4         1.2 versicolor
## 92           6.1         3.0          4.6         1.4 versicolor
## 93           5.8         2.6          4.0         1.2 versicolor
## 94           5.0         2.3          3.3         1.0 versicolor
## 95           5.6         2.7          4.2         1.3 versicolor
## 96           5.7         3.0          4.2         1.2 versicolor
## 97           5.7         2.9          4.2         1.3 versicolor
## 98           6.2         2.9          4.3         1.3 versicolor
## 99           5.1         2.5          3.0         1.1 versicolor
## 100          5.7         2.8          4.1         1.3 versicolor

2.3 特殊記号

2.3.1 コメント

# で始まる行はコメントです。 行の途中に # がある場合は,そこから右,改行までの文字がコメントとみなされます。 Rはコメントを無視します。 コメントは人間が読んで理解できるようなことを書くのに重宝します。 Rはコメントを無視するため,そこには何を書いても問題ありません。

例えば,コードを書き換える場合を想像してみてください。 新しいコードに問題があったときに,古いコードを復活させるかもしれず,残しておきたい,しかし,古いコードは実行したくないというときに,古いコードの先頭にコメントを付けることがあります。 他には,「このコードは一部の人のみ実行してください」や「このコードは実行しなくてもよい」といった意味で使用することもあります。

2.3.2 セミコロン

通常,Rでは1行に複数のコマンドを書きません。 ただし,1行に複数のコマンドを書くこともできます。 何らかの理由により,1行に複数のコマンドを書きたい場合は,次のように ; で繋げます。

x <- 1:100; sum(x)
## [1] 5050

ただし,こうしたからといって処理速度が速くなることはありません。 一方,人間がコードを読むときに,コードが詰まって書かれていると読みづらくなるため,基本的に1行に複数のコマンドは書かないことが多いです。

なお,; を使って書くと,コマンドと返り値の順番に変化がもたらされます。

sum(x)
## [1] 5050
mean(x)
## [1] 50.5

; のない場合とある場合とで,コマンドと返り値が表示される順番に違いがあることに注目してください。

sum(x); mean(x)
## [1] 5050
## [1] 50.5

返り値がまとまってほしいときに便利ですが,そうなってほしいことは滅多にありません。

2.3.3 評価と同時に返り値を表示

コマンドを実行して,返り値を得ることを評価と呼びます。 このとき,同時に,その返り値を表示したい場合,コマンド全体を () で括ります。

(x <- 10)
## [1] 10

関数の () とは異なり,全体を () で括ります。 これは次のようなコマンドを実行するのと同じことです。

x <- 10
x
## [1] 10

このように冗長に書くよりも,() を使った方が分かりやすいことがたまにあります。

2.4 入門書

奥村先生による 統計・データ解析 は大変参考になります。 時間をかけてじっくり読むとともに,自分のパソコンで同じようにできるか確かめてください。

また,Posit Cloud にある Posit Primers は時間をかけて読む価値がありそうです。

2.4.1 チートシート

Posit Cheat Sheets

チートシートの日本語訳がここからダウンロードできます(ページ右側の Downloadボタンをクリック)。

2.5 練習問題

  1. 次の変数 x を文字列に変換しなさい。
x <- 1990:2010
  1. 次の変数 y を文字列に変換しなさい。
x <- c("松山市", "今治市", "宇和島市", "八幡浜市", "新居浜市", "西条市", "大洲市", "伊予市", "四国中央市", "西予市", "東温市")
y <- factor(x, level = x)
  1. 次の変数 y を数値に変換しなさい。
x <- c("2", "1", "5", "4", "3")
y <- factor(x, level = x)
  1. 次のデータフレーム z があるとする。z を使って,2000年以降の value の値の平均を求めなさい。
x <- 1990:2021
y <- seq(5000, 5030, 2)
z <- data.frame(year = x, value = y)
  1. CSV Files から任意のCSVファイルをダウンロードして,R上の変数 x に読み込みなさい。また,正しく読み込めたかを確かめなさい。
  • ヒント:CSVファイルを読み込む関数は,read.csv() です。
  1. 気象庁の次のWebサイトからCSVファイルをダウンロードして,変数 temp に読み込んだ後,世界全体の年平均気温偏差の最大値と最小値を求めなさい。
  1. 政府統計の総合窓口(e-Stat) から任意のExcelファイルをダウンロードして,R上の変数 excercise に読み込みなさい。また,正しく読み込めたかを確かめなさい。