まず、データをダウンロードする。
dir.create("data") # dataディレクトリがない場合は作る
download.file(url = "https://git.io/fxfKq",
destfile = "data/ex-ch05a.csv")
ダウンロードしたデータを読み込み、df_a という名前のデータフレームを作る。
データの中身をいくつかの方法で確認する。まず、データフレームに含まれる変数の名前を確認する。
## [1] "country" "year" "x" "y"
このデータフレームには表示された四つの変数があることが分かる。
次に、データの行数(標本サイズ; 観測数)を確認する。
## [1] 126
行数が126 であることがわかる。先ほど確認した変数の数と合わせると、df_aは、126行 \(\times\) 4列のデータフレームであることが分かる。これは、
## [1] 126 4
で確かめられる。また、RStudio の Environmentタブにも、この情報は表示されている。
head()
とtail()
を使って、データの中身を見てみよう。
## # A tibble: 6 x 4
## country year x y
## <chr> <int> <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
で表示する行数を指定できる。
## # A tibble: 9 x 4
## country year x y
## <chr> <int> <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 に含まれている)。
## Observations: 126
## Variables: 4
## $ country <chr> "China", "China", "China", "China", "China", "China", ...
## $ year <int> 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ...
## $ x <dbl> 4792.126, 4474.876, 5110.904, 4861.371, 4879.151, 4598...
## $ y <dbl> 6185.759, 5504.153, 5307.269, 4423.372, 4609.255, 4846...
観測数、変数の数が表示され、それぞれの変数の型(chr [文字列], int [整数], dbl [小数])と、各変数の先頭部分が表示されており、ここまで確認してきた情報を一気に把握することができる。
縦長データであるdf_aから変数をyを除外して、横長データに変換する。
横長になったかどうか確認する。
## # A tibble: 7 x 7
## year China France Germany Japan UK USA
## <int> <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.
上で作った横長データwide を縦長データに変換する。
縦長になったかどうか確認する。
## # A tibble: 10 x 3
## year country x
## <int> <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.
## # A tibble: 10 x 3
## year country x
## <int> <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.
表計算ソフトでのデータの入力は省略する。代わりに、表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()
で一旦データフレームを消去しよう。
上での保存したcsvファイルを改めて読み込み、df2という名前のデータフレームを作ろう。
データの中身を確認する。
## Observations: 10
## Variables: 4
## $ name <chr> "Amy", "Ben", "Chris", "Daisy", "Emily", "Fin", "Gary",...
## $ female <int> 1, 0, 0, 1, 1, 0, 0, 1, 0, 1
## $ height <int> 168, 180, 172, 165, 175, 192, 165, 170, 176, 168
## $ weight <int> 55, 77, 90, 60, 67, 84, 57, 62, 70, 62
先ほど作ったデータが正しく読み込めたことが確認できる。
女性のみを含むデータフレームを作り、身長が低い順(昇順)に並べ替える。
## # A tibble: 5 x 4
## name female height weight
## <chr> <int> <int> <int>
## 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)に並べ替える。
## # A tibble: 5 x 4
## name female height weight
## <chr> <int> <int> <int>
## 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
三つのデータセットをダウンロードし、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")
それぞれのデータの中身を確認する。
## Observations: 3
## Variables: 3
## $ country <chr> "China", "US", "Japan"
## $ democracy <int> 0, 1, 1
## $ asia <int> 1, 0, 1
df_bは3行3列のデータフレームで、文字列型の変数が一つ、整数型の変数が二つある。
## Observations: 2
## Variables: 3
## $ country <chr> "UK", "Germany"
## $ asia <int> 1, 0
## $ democracy <int> 1, 1
df_cは2行3列のデータフレームで、文字列型の変数が一つ、整数型の変数が二つある。 df_bと同じ変数が含まれているが、保存されている順番が異なる。
## Observations: 4
## Variables: 2
## $ country <chr> "Germany", "US", "Japan", "Brazil"
## $ federal <int> 1, 1, 0, 1
df_d は4行2列のデータフレームで、文字列型の変数と整数型の変数が一つずつある。
df_bとdf_cに含まれる変数はまったく同じで、観測対象が異なるので、データフレームを縦に結合する。
## # A tibble: 5 x 3
## country democracy asia
## <chr> <int> <int>
## 1 China 0 1
## 2 US 1 0
## 3 Japan 1 1
## 4 UK 1 1
## 5 Germany 1 0
df_d とdf_e は異なる変数を持っているので、横に結合する。その際、両者に含まれる国名 (country) が一致する行同士を結合する。df_dに含まれる国だけを残す。
## # A tibble: 4 x 4
## country federal democracy asia
## <chr> <int> <int> <int>
## 1 Germany 1 1 0
## 2 US 1 1 0
## 3 Japan 0 1 1
## 4 Brazil 1 NA NA
df_d とdf_e は異なる変数を持っているので、横に結合する。その際、両者に含まれる国名 (country) が一致する行同士を結合する。df_eに含まれる国だけを残す。
## # A tibble: 5 x 4
## country federal democracy asia
## <chr> <int> <int> <int>
## 1 China NA 0 1
## 2 US 1 1 0
## 3 Japan 0 1 1
## 4 UK NA 1 1
## 5 Germany 1 1 0
df_d とdf_e は異なる変数を持っているので、横に結合する。その際、両者に含まれる国名 (country) が一致する行同士を結合する。少なくとも一方のデータフレームに含まれる国はすべて残す。
## # A tibble: 6 x 4
## country federal democracy asia
## <chr> <int> <int> <int>
## 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
df_d とdf_e は異なる変数を持っているので、横に結合する。その際、両者に含まれる国名 (country) が一致する行同士を結合する。両方のデータフレームに含まれる国だけを残す。
## # A tibble: 3 x 4
## country federal democracy asia
## <chr> <int> <int> <int>
## 1 Germany 1 1 0
## 2 US 1 1 0
## 3 Japan 0 1 1