109  filter()の練習問題

ここでも、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の「男性」シートからデータを取得してください。

library(tidyverse)
── 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)

colnames(dat)
[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等の正規表現を利用できる関数の紹介を行います。

この二つの内容を理解いただけると、

文字列に対して自由にロジカル型のベクトルを設定できるようになり、文字列データを自由に絞り込んだり加工したりすることができるようになりますのでがんばってください。