第11回 データ・ハンドリング(3)
関西大学総合情報学部
2024-06-20
すぐに実習できるように準備しておきましょう。
Data
フォルダーを作成し、そこにアップロードしましょう。bind_rows()
を利用:変数名が一致する必要がある
ID
、Name
、Score
で構成されている。
ID
、Name
、Score
の順番は一致しなくても良い(上のdata.frameの順番に調整される)。結合前のデータ識別変数の追加
list()
でまとめ、.id
引数を追加するlist()
の内部では"識別変数の値" = 結合するデータ
と定義例) 結合後、Class
という列を追加し、元々Data1
だった行は"1組"
、Data2
だった行には"2組"
を格納する。
*_join()
:結合に使う識別用の変数(キー変数)が必要(以下ではCity
)
結合後
識別子は両データに含まれているが、一致しないケースがある。
left_join()
right_join()
inner_join()
full_join()
left_join()
の仕組みleft_join(データ1, データ2, by = "識別用変数名")
NA
)で埋められる
right_join()
の仕組みright_join(データ1, データ2, by = "識別用変数名")
NA
)で埋められる
inner_join()
の仕組みinner_join(データ1, データ2, by = "識別用変数名")
full_join()
の仕組みfull_join(データ1, データ2, by = "識別用変数名")
NA
)で埋められる
by = "識別用の変数名"
は複数用いることも可能(例:都道府県名&年度で結合)
by = c("識別用の変数名1", "識別用の変数名2")
Tidy data:Hadley Wickhamが提唱したデータ分析に適したデータ構造
2020年8月24日
という値がある場合
filter()
関数等で、異なる単位の行を除外
雑然データから整然データへ変形をサポートするパッケージ
pivot_longer()
:Wide型データからLong型データへ
pivot_wider()
:Long型データからWide型データへ
separate()
:セルの分割(「年月日」から「年」、「月」、「日」へ)
filter()
などで除外covid_sample.csv
:中国、日本、韓国、モンゴル、台湾の5日間COVID-19新規感染者数
# A tibble: 5 × 7
Country Population `2022/06/09` `2022/06/10` `2022/06/11` `2022/06/12`
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 China 1447470092 819 848 1114 990
2 Japan 126476461 16788 15584 15338 13381
3 Korea 51269185 9304 8428 7382 3828
4 Mongolia 3278290 0 0 0 0
5 Taiwan 23816775 72846 68293 79616 50567
# ℹ 1 more variable: `2022/06/13` <dbl>
Country | Population | 2022/06/09 | 2022/06/10 | 2022/06/11 | 2022/06/12 | 2022/06/13 |
---|---|---|---|---|---|---|
China | 1447470092 | 819 | 848 | 1114 | 990 | 957 |
Japan | 126476461 | 16788 | 15584 | 15338 | 13381 | 7942 |
Korea | 51269185 | 9304 | 8428 | 7382 | 3828 | 9768 |
Mongolia | 3278290 | 0 | 0 | 0 | 0 | 1055 |
Taiwan | 23816775 | 72846 | 68293 | 79616 | 50567 | 45100 |
COVID_df
の構造は?
# A tibble: 25 × 4
Country Population Date New_Cases
<chr> <dbl> <chr> <dbl>
1 China 1447470092 2022/06/09 819
2 China 1447470092 2022/06/10 848
3 China 1447470092 2022/06/11 1114
4 China 1447470092 2022/06/12 990
5 China 1447470092 2022/06/13 957
6 Japan 126476461 2022/06/09 16788
7 Japan 126476461 2022/06/10 15584
8 Japan 126476461 2022/06/11 15338
9 Japan 126476461 2022/06/12 13381
10 Japan 126476461 2022/06/13 7942
# ℹ 15 more rows
pivot_longer()
:Wide to Longcols
はdplyr::select()
と同じ使い方
c()
で個別の変数名を指定することも、:
やstarts_with()
、!
、-
を使うこともOK`
か"
で囲む。
/
や-
など)が含まれるケースが多い。pivot_longer()
:WideからLongへcols = starts_with("2022")
もOKCOVID_Long <- COVID_df |>
pivot_longer(cols = "2022/06/09":"2022/06/13",
names_to = "Date",
values_to = "New_Cases")
COVID_Long
# A tibble: 25 × 4
Country Population Date New_Cases
<chr> <dbl> <chr> <dbl>
1 China 1447470092 2022/06/09 819
2 China 1447470092 2022/06/10 848
3 China 1447470092 2022/06/11 1114
4 China 1447470092 2022/06/12 990
5 China 1447470092 2022/06/13 957
6 Japan 126476461 2022/06/09 16788
7 Japan 126476461 2022/06/10 15584
8 Japan 126476461 2022/06/11 15338
9 Japan 126476461 2022/06/12 13381
10 Japan 126476461 2022/06/13 7942
# ℹ 15 more rows
pivot_wider()
:LongからWideへ# A tibble: 5 × 7
Country Population `2022/06/09` `2022/06/10` `2022/06/11` `2022/06/12`
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 China 1447470092 819 848 1114 990
2 Japan 126476461 16788 15584 15338 13381
3 Korea 51269185 9304 8428 7382 3828
4 Mongolia 3278290 0 0 0 0
5 Taiwan 23816775 72846 68293 79616 50567
# ℹ 1 more variable: `2022/06/13` <dbl>
pivot_longer()
とpivot_wider()
separate()
:列の分割COVID_Long
のDate
列をYear
、Month
、Day
に分けたい
Date
列を"/"
を基準に分割するseparate()
:列の分割# A tibble: 25 × 6
Country Population Year Month Day New_Cases
<chr> <dbl> <chr> <chr> <chr> <dbl>
1 China 1447470092 2022 06 09 819
2 China 1447470092 2022 06 10 848
3 China 1447470092 2022 06 11 1114
4 China 1447470092 2022 06 12 990
5 China 1447470092 2022 06 13 957
6 Japan 126476461 2022 06 09 16788
7 Japan 126476461 2022 06 10 15584
8 Japan 126476461 2022 06 11 15338
9 Japan 126476461 2022 06 12 13381
10 Japan 126476461 2022 06 13 7942
# ℹ 15 more rows
例) City_Data
のCity
列が「都道府県名+市区町村」
# A tibble: 4 × 2
City Pop
<chr> <dbl>
1 北海道音威子府村 693
2 大阪府高槻市 347424
3 広島県府中市 36471
4 鹿児島県指宿市 38207
正規表現(regular expression)の知識が必要
City_Data |>
# 任意の2文字の後に「都道府県」のいずれかが来るか、
# 任意の3文字の後に「県」が来たら、そこまでをブロック1、残りをブロック2とする
# Cityの値を「ブロック1-ブロック2」に置換する
mutate(City = str_replace(City, "^(.{2}[都道府県]|.{3}県)(.+)",
"\\1-\\2")) |>
# 「-」を基準に列を分割
separate(col = "City", into = c("Pref", "City"), sep = "-")
# A tibble: 4 × 3
Pref City Pop
<chr> <chr> <dbl>
1 北海道 音威子府村 693
2 大阪府 高槻市 347424
3 広島県 府中市 36471
4 鹿児島県 指宿市 38207
{tidyr}と{dplyr}を組み合わせることも可能
COVID_df |>
pivot_longer(cols = "2022/06/09":"2022/06/13",
names_to = "Date",
values_to = "New_Cases") |>
mutate(New_Case_per_1M = New_Cases / Population * 1000000) |>
group_by(Country) |>
summarise(New_Case_per_1M = mean(New_Case_per_1M))
# A tibble: 5 × 2
Country New_Case_per_1M
<chr> <dbl>
1 China 0.653
2 Japan 109.
3 Korea 151.
4 Mongolia 64.4
5 Taiwan 2657.