パッケージの読み込み

library(tidyverse)

Q5-1

まず、データをダウンロードする。

dir.create("data")  # dataディレクトリがない場合は作る
download.file(url = "https://git.io/fxfKq",
              destfile = "data/ex-ch05a.csv")

ダウンロードしたデータを読み込み、df_a という名前のデータフレームを作る。

df_a <- read_csv("data/ex-ch05a.csv")

Q5-1-1

データの中身をいくつかの方法で確認する。まず、データフレームに含まれる変数の名前を確認する。

names(df_a)
## [1] "country" "year"    "x"       "y"

このデータフレームには表示された四つの変数があることが分かる。

次に、データの行数(標本サイズ; 観測数)を確認する。

nrow(df_a)
## [1] 126

行数が126 であることがわかる。先ほど確認した変数の数と合わせると、df_aは、126行 \(\times\) 4列のデータフレームであることが分かる。これは、

dim(df_a)
## [1] 126   4

で確かめられる。また、RStudio の Environmentタブにも、この情報は表示されている。

head()tail()を使って、データの中身を見てみよう。

head(df_a) # 最初の6行を表示
## # A tibble: 6 × 4
##   country  year     x     y
##   <chr>   <dbl> <dbl> <dbl>
## 1 China    1990 4792. 6186.
## 2 China    1991 4475. 5504.
## 3 China    1992 5111. 5307.
## 4 China    1993 4861. 4423.
## 5 China    1994 4879. 4609.
## 6 China    1995 4599. 4847.

最初の6行はChinaの1990年から1995年のデータであり、x とy には数値(小数, dbl [double])が入っていることが分かる。

同様にデータの末尾を確認してみよう。引数 nで表示する行数を指定できる。

tail(df_a, n = 9)  # 最後の9行を表示
## # A tibble: 9 × 4
##   country  year     x      y
##   <chr>   <dbl> <dbl>  <dbl>
## 1 USA      2002 6154.  4604.
## 2 USA      2003 4350.  6696.
## 3 USA      2004 4724.  4438.
## 4 USA      2005 5281.  8854.
## 5 USA      2006 5780.  4566.
## 6 USA      2007 5603. 10026.
## 7 USA      2008 5707.  7909.
## 8 USA      2009 5843.  7232.
## 9 USA      2010 5245.  6391.

最後の9行はUSAのデータであることが分かる。

最後に、dplyr::glimpse() を使ってデータの中身を確認してみよう(dplyrパッケージは tidyverse に含まれている)。

glimpse(df_a)
## Rows: 126
## Columns: 4
## $ country <chr> "China", "China", "China", "China", "China", "China", "China",…
## $ year    <dbl> 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 20…
## $ x       <dbl> 4792.126, 4474.876, 5110.904, 4861.371, 4879.151, 4598.741, 51…
## $ y       <dbl> 6185.759, 5504.153, 5307.269, 4423.372, 4609.255, 4846.601, 56…

観測数、変数の数が表示され、それぞれの変数の型(chr [文字列], int [整数], dbl [小数])と、各変数の先頭部分が表示されており、ここまで確認してきた情報を一気に把握することができる。

Q5-1-2

縦長データであるdf_aから変数をyを除外して、横長データに変換する。

wide <- df_a %>% 
  select(-y) %>% 
  spread(key = "country", value = "x")

横長になったかどうか確認する。

head(wide, n = 7)
## # A tibble: 7 × 7
##    year China France Germany Japan    UK   USA
##   <dbl> <dbl>  <dbl>   <dbl> <dbl> <dbl> <dbl>
## 1  1990 4792.  5058.   5124. 4941. 4148. 4968.
## 2  1991 4475.  4615.   4816. 5503. 4929. 5114.
## 3  1992 5111.  5779.   4975. 5036. 5460. 4762.
## 4  1993 4861.  5080.   4933. 4409. 5441. 4464.
## 5  1994 4879.  4844.   5287. 5678. 4817. 4809.
## 6  1995 4599.  4646.   5655. 5221. 6134. 3961.
## 7  1996 5117.  4621.   4094. 4808. 4626. 4672.

Q5-1-3

上で作った横長データwide を縦長データに変換する。

long <- wide %>% 
  gather(key = "country", value = "x", -year)   # year はまとめない

縦長になったかどうか確認する。

head(long, n = 10)
## # A tibble: 10 × 3
##     year country     x
##    <dbl> <chr>   <dbl>
##  1  1990 China   4792.
##  2  1991 China   4475.
##  3  1992 China   5111.
##  4  1993 China   4861.
##  5  1994 China   4879.
##  6  1995 China   4599.
##  7  1996 China   5117.
##  8  1997 China   4411.
##  9  1998 China   5818.
## 10  1999 China   5649.
tail(long, n = 10)
## # A tibble: 10 × 3
##     year country     x
##    <dbl> <chr>   <dbl>
##  1  2001 USA     4774.
##  2  2002 USA     6154.
##  3  2003 USA     4350.
##  4  2004 USA     4724.
##  5  2005 USA     5281.
##  6  2006 USA     5780.
##  7  2007 USA     5603.
##  8  2008 USA     5707.
##  9  2009 USA     5843.
## 10  2010 USA     5245.

Q5-2

表計算ソフトでのデータの入力は省略する。代わりに、表5.6の内容をもつCSVファイルをRで作る。

tbl5_6 <- data_frame(
  name = c("Amy", "Ben", "Chris", "Daisy", "Emily",
           "Fin", "Gary", "Hilary", "Isaac", "Jenny"),
  female = c(1, 0, 0, 1, 1, 0, 0, 1, 0, 1),
  height = c(168, 180, 172, 165, 175, 192, 165, 170, 176, 168),
  weight = c(55, 77, 90, 60, 67, 84, 57, 62, 70, 62)
)
write_csv(tbl5_6, path = "data/table5-6.csv")

上で定義したtbl5_6をそのまま使ってもよいが、練習のためにrm() で一旦データフレームを消去しよう。

rm(tbl5_6)

上での保存したcsvファイルを改めて読み込み、df2という名前のデータフレームを作ろう。

df2 <- read_csv("data/table5-6.csv")

データの中身を確認する。

glimpse(df2)
## Rows: 10
## Columns: 4
## $ name   <chr> "Amy", "Ben", "Chris", "Daisy", "Emily", "Fin", "Gary", "Hilary…
## $ female <dbl> 1, 0, 0, 1, 1, 0, 0, 1, 0, 1
## $ height <dbl> 168, 180, 172, 165, 175, 192, 165, 170, 176, 168
## $ weight <dbl> 55, 77, 90, 60, 67, 84, 57, 62, 70, 62

先ほど作ったデータが正しく読み込めたことが確認できる。

女性のみを含むデータフレームを作り、身長が低い順(昇順)に並べ替える。

W <- df2 %>% 
  filter(female == 1) %>%  # 女性だけ抜き出す
  arrange(height)          # 身長が低い順並べ替える
W
## # A tibble: 5 × 4
##   name   female height weight
##   <chr>   <dbl>  <dbl>  <dbl>
## 1 Daisy       1    165     60
## 2 Amy         1    168     55
## 3 Jenny       1    168     62
## 4 Hilary      1    170     62
## 5 Emily       1    175     67

男性のみを含むデータフレームを作り、体重が重い順(降順; descending order)に並べ替える。

M <- df2 %>% 
  filter(female != 1) %>%  # 男性だけ抜き出す 
  arrange(desc(weight))    # 体重が重い順に並べ替える
M
## # A tibble: 5 × 4
##   name  female height weight
##   <chr>  <dbl>  <dbl>  <dbl>
## 1 Chris      0    172     90
## 2 Fin        0    192     84
## 3 Ben        0    180     77
## 4 Isaac      0    176     70
## 5 Gary       0    165     57

Q5-3

三つのデータセットをダウンロードし、dataディレクトリに保存する。

download.file(url = "https://git.io/fxfKs",
              destfile = "data/ex-ch05b.csv")
download.file(url = "https://git.io/fxfKZ",
              destfile = "data/ex-ch05c.csv")
download.file(url = "https://git.io/fxfKn",
              destfile = "data/ex-ch05d.csv")

ダウンロードした三つのCSVファイルを読み込み、それぞれdf_b、df_c、df_d という名前のデータフレームにする。

df_b <- read_csv("data/ex-ch05b.csv")
df_c <- read_csv("data/ex-ch05c.csv")
df_d <- read_csv("data/ex-ch05d.csv")

それぞれのデータの中身を確認する。

glimpse(df_b)
## Rows: 3
## Columns: 3
## $ country   <chr> "China", "US", "Japan"
## $ democracy <dbl> 0, 1, 1
## $ asia      <dbl> 1, 0, 1

df_bは3行3列のデータフレームで、文字列型の変数が一つ、整数型の変数が二つある。

glimpse(df_c)
## Rows: 2
## Columns: 3
## $ country   <chr> "UK", "Germany"
## $ asia      <dbl> 1, 0
## $ democracy <dbl> 1, 1

df_cは2行3列のデータフレームで、文字列型の変数が一つ、整数型の変数が二つある。 df_bと同じ変数が含まれているが、保存されている順番が異なる。

glimpse(df_d)
## Rows: 4
## Columns: 2
## $ country <chr> "Germany", "US", "Japan", "Brazil"
## $ federal <dbl> 1, 1, 0, 1

df_d は4行2列のデータフレームで、文字列型の変数と整数型の変数が一つずつある。

Q5-3-1

df_bとdf_cに含まれる変数はまったく同じで、観測対象が異なるので、データフレームを縦に結合する。

df_e <- bind_rows(df_b, df_c)
df_e
## # A tibble: 5 × 3
##   country democracy  asia
##   <chr>       <dbl> <dbl>
## 1 China           0     1
## 2 US              1     0
## 3 Japan           1     1
## 4 UK              1     1
## 5 Germany         1     0

Q5-3-2

df_d とdf_e は異なる変数を持っているので、横に結合する。その際、両者に含まれる国名 (country) が一致する行同士を結合する。df_dに含まれる国だけを残す。

left_join(df_d, df_e, by = "country")
## # A tibble: 4 × 4
##   country federal democracy  asia
##   <chr>     <dbl>     <dbl> <dbl>
## 1 Germany       1         1     0
## 2 US            1         1     0
## 3 Japan         0         1     1
## 4 Brazil        1        NA    NA
# right_join(df_e, df_d, by = "country")  # これでも上と同じ結果になる hh

Q5-3-3

df_d とdf_e は異なる変数を持っているので、横に結合する。その際、両者に含まれる国名 (country) が一致する行同士を結合する。df_eに含まれる国だけを残す。

right_join(df_d, df_e, by = "country")
## # A tibble: 5 × 4
##   country federal democracy  asia
##   <chr>     <dbl>     <dbl> <dbl>
## 1 Germany       1         1     0
## 2 US            1         1     0
## 3 Japan         0         1     1
## 4 China        NA         0     1
## 5 UK           NA         1     1
# left_join(df_e, df_d, by = "country")  # これでも上と同じ結果になる 

Q5-3-4

df_d とdf_e は異なる変数を持っているので、横に結合する。その際、両者に含まれる国名 (country) が一致する行同士を結合する。少なくとも一方のデータフレームに含まれる国はすべて残す。

full_join(df_d, df_e, by = "country")
## # A tibble: 6 × 4
##   country federal democracy  asia
##   <chr>     <dbl>     <dbl> <dbl>
## 1 Germany       1         1     0
## 2 US            1         1     0
## 3 Japan         0         1     1
## 4 Brazil        1        NA    NA
## 5 China        NA         0     1
## 6 UK           NA         1     1

Q5-3-5

df_d とdf_e は異なる変数を持っているので、横に結合する。その際、両者に含まれる国名 (country) が一致する行同士を結合する。両方のデータフレームに含まれる国だけを残す。

inner_join(df_d, df_e, by = "country")
## # A tibble: 3 × 4
##   country federal democracy  asia
##   <chr>     <dbl>     <dbl> <dbl>
## 1 Germany       1         1     0
## 2 US            1         1     0
## 3 Japan         0         1     1