第4章 観察の選択

ここではTriangulating Peaceのレプリケーションデータを使用します。

library(tidyverse)
data <- read.csv("data/triangle.csv")

4.1 数値の大小による選択

R標準の方法ではdata[条件,]条件部分に適当な論理値を入力して抜き出します。 例えば、1990年以降のデータだけを取り出す場合は以下のようにします。

head(data[data$year >= 1990,])

なお、>=の代わりに>とすると1990年の観察は除外されます。

head(data[data$year > 1990,])
  • 未満の場合は<、以下の場合は<=を使います。

tidyverseの中のdplyrというパッケージのfilter()という関数を使うともう少し簡単に書くことができます。 filter()はオブジェクトと条件式を入力すると条件に合致する観察を抜き出します。

data %>% 
  filter(year >= 1990) %>% 
  head()
  • data$変数名のように書かなくていいので楽です。

4.2 一致・不一致による選択

変数が特定の値に一致するときは==を使います。 例えば、1990年「のみ」の観察を抜き出すには次のようにします。

head(data[data$year == 1990,])
  • =ではない点に注意して下さい。

不一致の場合は!=を使います。 例えばstatea2(アメリカ)でない観察を抜き出すには次のようにします。

head(data[data$statea != 2,])

条件式の前に!を付けることで逆を表現することができます。 以下のコードは上記のコードと同じです。

head(data[!data$statea == 2,])

4.3 「または」

複数の条件のいずれかに合致するものを抜き出すには|を使います。 例えば、stateaもしくはstateb710(中国)である観察を抜き出す場合は次のようにします。

head(data[data$statea == 710 | data$stateb == 710,])

4.4 「かつ」

複数の条件の全てに合致するものを抜き出すには&を使います。 例えば、statea710stateb740(日本)である観察を抜き出す場合は次のようにします。

head(data[data$statea == 710 & data$stateb == 740,])

4.5 部分集合

year1950年から1990年までの10年刻みの観察を抜き出したいとします。 |を使うとこのようになります。

head(data[data$year == 1950 | data$year == 1960 | data$year == 1970 | data$year == 1980 | data$year == 1990,])

これではコードが長くなり面倒ですが、代わりに%in%を使うことができます。 %in%は左のベクトルで要素が右のベクトルの要素のどれかに一致するものを抜き出します

head(data[data$year %in% c(1950, 1960, 1970, 1980, 1990),])

なお、等差数列を作る関数seq()を使うともっと簡単に書けます。

head(data[data$year %in% seq(1950, 1990, by = 10),])

tidyverseの場合はfilter()の中に複数の条件式を書いていきます。

4.6 番号による選択

特定の行だけを抜き出したい場合は、条件式の部分に当該番号を入力します。 例えば、最初の観察を抜き出すには次のようにします。

head(data[1,])

c()を使って複数行を選択することもできます。

head(data[c(1,3,5),])

nrow()はデータの行数を返す関数なので、一番下の観察を抜き出すには次のようにします。

head(data[nrow(data),])

-を付けるとその行を除外します。

head(data[-1,])

tidyverseで、行番号で指定する場合はslice()を使います。

head(slice(data, 1))

4.7 観察の並び替え

変数の大きさによって並び替えをする場合、order()を使います。 例えば、年が古い順に並べる場合は次のようにします。

head(data[order(data$year),])

逆に新しい順に並べる場合はオプションでdecreasing = TRUEとします。

head(data[order(data$year, decreasing = TRUE),])

tidyverseで観察を並び替える場合はarrange()を使います。

data %>% 
  arrange(year) %>% 
  head()

降順にする場合は変数名をdesc()で囲みます。

data %>% 
  arrange(desc(year)) %>% 
  head()

複数の基準で並び替えることもできます。

data %>% 
  arrange(desc(year), desc(dispute1)) %>% 
  head()

4.8 ベクトルの選択*

なお、ベクトルは1行あるいは1列の行列と見ることができますが、Rでは行列とは区別されます。 ベクトルの要素にアクセスする場合は[]の中にアクセスしたい番号(のベクトル)を入れます。

例えば、lettersというアルファベットのベクトルを考えます。

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"

第1要素にアクセスする場合はこう書きます。

letters[1]
## [1] "a"

第1から第3要素までアクセスする場合はこう書きます。

letters[1:3]
## [1] "a" "b" "c"
  • 1:31から3まで1刻みに増えるベクトルを意味します。だ

データフレームからベクトルを抜き出す場合は$で変数を指定します。

head(data$year)
## [1] 1920 1921 1922 1923 1924 1925

tidyverseではpull()という関数を使います。

data %>% 
  pull(year) %>% 
  head()
## [1] 1920 1921 1922 1923 1924 1925