ここでも、arrangeに引き続き、data/population.xlsxを利用しましょう。
練習問題1
data/population.xlsxの「男性」シートからデータを取得してください。 練習問題2
列名が数字になっているものの頭にnenを付けてください(例: 2015 -> nen2015) 練習問題3
2015年の人口が1000(100万人)以上の都道府県にデータを絞りこんでください 練習問題4
2017年から2018年と、2018年から2019年で連続して人口が増加している都道府県に絞り込んでください。
それでは答えを見ていきましょう。
練習問題1
data/population.xlsxの「男性」シートからデータを取得してください。
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.2 ✔ tibble 3.2.1
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
✔ purrr 1.0.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
dat <- read_excel("data/population.xlsx", sheet="男性")
dat
# A tibble: 47 × 7
都道府県名 Prefecture `2015` `2016` `2017` `2018` `2019`
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 北海道 Hokkaido 2537 2521 2506 2489 2472
2 青森県 Aomori-ken 615 608 600 593 585
3 岩手県 Iwate-ken 616 610 604 598 592
4 宮城県 Miyagi-ken 1140 1139 1136 1132 1127
5 秋田県 Akita-ken 480 474 468 461 454
6 山形県 Yamagata-ken 540 536 531 526 520
7 福島県 Fukushima-ken 946 941 932 923 914
8 茨城県 Ibaraki-ken 1454 1448 1442 1435 1427
9 栃木県 Tochigi-ken 982 978 974 969 964
10 群馬県 Gumma-ken 973 971 968 965 962
# ℹ 37 more rows
ここは特に問題ありませんね?
練習問題2
列名が数字になっているものの頭にnenを付けてください(例: 2015 -> nen2015)
[1] "都道府県名" "Prefecture" "2015" "2016" "2017"
[6] "2018" "2019"
dat2 <- dat %>%
rename(
nen2015 = `2015`,
nen2016 = `2016`,
nen2017 = `2017`,
nen2018 = `2018`,
nen2019 = `2019`,
)
dat2
# A tibble: 47 × 7
都道府県名 Prefecture nen2015 nen2016 nen2017 nen2018 nen2019
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 北海道 Hokkaido 2537 2521 2506 2489 2472
2 青森県 Aomori-ken 615 608 600 593 585
3 岩手県 Iwate-ken 616 610 604 598 592
4 宮城県 Miyagi-ken 1140 1139 1136 1132 1127
5 秋田県 Akita-ken 480 474 468 461 454
6 山形県 Yamagata-ken 540 536 531 526 520
7 福島県 Fukushima-ken 946 941 932 923 914
8 茨城県 Ibaraki-ken 1454 1448 1442 1435 1427
9 栃木県 Tochigi-ken 982 978 974 969 964
10 群馬県 Gumma-ken 973 971 968 965 962
# ℹ 37 more rows
この問題はrename関数の使い方の復習です。
練習問題3
2015年の人口が1000(100万人)以上の都道府県にデータを絞りこんでください
dat2 %>%
filter(nen2015 >= 1000)
# A tibble: 16 × 7
都道府県名 Prefecture nen2015 nen2016 nen2017 nen2018 nen2019
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 北海道 Hokkaido 2537 2521 2506 2489 2472
2 宮城県 Miyagi-ken 1140 1139 1136 1132 1127
3 茨城県 Ibaraki-ken 1454 1448 1442 1435 1427
4 埼玉県 Saitama-ken 3628 3639 3648 3658 3668
5 千葉県 Chiba-ken 3096 3099 3103 3105 3105
6 東京都 Tokyo-to 6667 6717 6760 6802 6846
7 神奈川県 Kanagawa-ken 4559 4565 4569 4576 4585
8 新潟県 Niigata-ken 1115 1107 1098 1088 1078
9 長野県 Nagano-ken 1022 1017 1012 1006 1000
10 静岡県 Shizuoka-ken 1821 1815 1810 1803 1797
11 愛知県 Aichi-ken 3741 3755 3764 3770 3780
12 京都府 Kyoto-fu 1249 1246 1242 1238 1234
13 大阪府 Osaka-fu 4256 4249 4241 4232 4227
14 兵庫県 Hyogo-ken 2642 2633 2624 2614 2605
15 広島県 Hiroshima-ken 1376 1375 1372 1367 1362
16 福岡県 Fukuoka-ken 2410 2413 2415 2416 2416
fiterの基本的な使い方です。
練習問題4
2017年から2018年と、2018年から2019年で連続して人口が増加している都道府県に絞り込んでください。
この問題は少し難しいかもしれません
答えは、
dat2 %>%
mutate(diff1718 = nen2018 - nen2017,
diff1819 = nen2019 - nen2018) %>%
filter(diff1718 > 0 & diff1819 > 0) %>%
select(`都道府県名`, diff1718, diff1819)
# A tibble: 5 × 3
都道府県名 diff1718 diff1819
<chr> <dbl> <dbl>
1 埼玉県 10 10
2 東京都 42 44
3 神奈川県 7 9
4 愛知県 6 10
5 沖縄県 3 3
となります。
mutateで、まず各年度間の差を計算して、それをfilterで0より大きいものに絞り込んでいます最後のselectは画面に収めるためのものです。
いかがでしたでしょうか?
filter関数とlogicalベクトルの組み合わせで行を絞り込む方法についてイメージはつきましたか?
filter関数、ここまで数字に基づいた絞りこみを行ってきましたが、実は文字列型に対しても絞り込みを行うこともできます。
例えば
temp <- tibble(
name = c("apple","apricot","banana","cherry"),
price = c(120,200,98,300)
)
temp
# A tibble: 4 × 2
name price
<chr> <dbl>
1 apple 120
2 apricot 200
3 banana 98
4 cherry 300
ですが、appleのみの列に絞りこむなら
temp %>% filter(name == "apple")
# A tibble: 1 × 2
name price
<chr> <dbl>
1 apple 120
で可能です。
それでは、aで始まるname列のみに絞りこみたいという場合はどうしたらよいでしょうか?
実はそれも簡単にできて、
temp %>% filter( str_detect(name,"^a") )
# A tibble: 2 × 2
name price
<chr> <dbl>
1 apple 120
2 apricot 200
また、aで終わる名前に絞りこみたいであれば、
temp %>% filter( str_detect(name, "a$"))
# A tibble: 1 × 2
name price
<chr> <dbl>
1 banana 98
です。
ここでaで始まるを意味する^aやaで終わるを意味するa$のことを正規表現といいます。
この正規表現を取り扱うためにstr_detectという関数が用意されています。
ここからは、この正規表現について解説して、その後、str_detect等の正規表現を利用できる関数の紹介を行います。
この二つの内容を理解いただけると、
文字列に対して自由にロジカル型のベクトルを設定できるようになり、文字列データを自由に絞り込んだり加工したりすることができるようになりますのでがんばってください。