-
Notifications
You must be signed in to change notification settings - Fork 0
/
AS04_Data-Manipulation-Joining.Rmd
202 lines (162 loc) · 11.4 KB
/
AS04_Data-Manipulation-Joining.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
---
title: "AS04_Data-Manipulation-Joining"
author: "你是誰 R09342000 新聞所碩五"
date: "2021/03/23"
output:
html_document:
number_sections: no
theme: united
highlight: tango
toc: yes
toc_depth: 4
toc_float:
collapsed: no
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, results = 'hold', comment = '#>', error = TRUE)
```
## 作業目的: Data Manipulation and Joining
這份作業希望能夠讓你熟悉於資料處理(data manipulation),利用這兩週所學的 filter, mutate, select, group by, summarize, join, pivot 等動詞完成任務。請一律印出 tibble,你可以利用 `as_tibble()` 將 dataframe 轉換成 tibble,不過按照預設的 code 應該都會是 tibble,另外印出結果不用特別打 `print()` 喔。作業的滿分為 100 分。
老師在影片中示範怎麼處理各村里的婚姻狀況,清理後再與公投資料串接,這次的作業則是要處理教育資料,資料中包含全台各村里 **15歲以上現住人口** 的性別、年齡、教育程度統計。請一定要先看影片再來寫!
## 作業: Data Manipulation and Joining
```{r message=FALSE, warning=FALSE}
### 這邊不要動
library(tidyverse)
df_education_raw <- read_csv("data/AS04/opendata107Y020.csv")
### 給你看資料長這樣
df_education_raw %>% glimpse()
```
將資料讀進來之後可以看到這份資料的長相,前幾列是村里的名稱與代碼,後面以 `edu_` 開頭的欄位則是代表該村里教育相關的狀態。舉例來說,`edu_doctor_graduated_m` 代表的是 `博畢_男`,`edu_juniorcollege_2ys_ungraduated_f` 代表的是 `二肄_女`,`edu_selftaughtl_m` 代表的是 `自修_男`,`edu_juniorcollege_5ys_first3y_ungraduated_f` 代表的是 `前三肄_女`。
「2畢」、「2肄」、「後3畢」、「後3肄」、「前3肄」於教育程度統計上分別指專科2、3年制、5專、5專後2年、5專前3年之畢業、肄業狀況。另外,肄業包含中途輟學、休學者,或正在學校求學之學生,所以在學生也算在裡面喔!
```{r message=FALSE, warning=FALSE}
### 這邊不要動
df_education <- df_education_raw %>%
slice(-1) %>%
select(-edu_age_15up_total, -statistic_yyy) %>%
mutate(across(contains("edu_"), ~as.integer(.)))
```
我把第一列刪掉後,再將用不到的欄位刪除,並且把教育相關欄位轉換成整數,接下來請用 `df_education` 作答!
### 1. `pivot_longer()`:
現在的資料是一個寬表格(wide),請利用 `pivot_longer()` 或是 `gather()` 將它轉換成長表格(long),儲存為 `df_education_long` ,並將 `df_education_long` 印出。
```{r message=FALSE, warning=FALSE}
### your code
### your result should be
#> # A tibble: 356,960 x 5
#> district_code site_id village key value
#> <chr> <chr> <chr> <chr> <int>
#> 1 65000010001 新北市板橋區 留侯里 edu_doctor_graduated_m 4
#> 2 65000010001 新北市板橋區 留侯里 edu_doctor_graduated_f 0
#> 3 65000010001 新北市板橋區 留侯里 edu_doctor_ungraduated_m 1
#> 4 65000010001 新北市板橋區 留侯里 edu_doctor_ungraduated_f 2
#> 5 65000010001 新北市板橋區 留侯里 edu_master_graduated_m 52
#> 6 65000010001 新北市板橋區 留侯里 edu_master_graduated_f 31
#> 7 65000010001 新北市板橋區 留侯里 edu_master_ungraduated_m 12
#> 8 65000010001 新北市板橋區 留侯里 edu_master_ungraduated_f 7
#> 9 65000010001 新北市板橋區 留侯里 edu_university_graduated_m 150
#> 10 65000010001 新北市板橋區 留侯里 edu_university_graduated_f 167
#> # … with 356,950 more rows
```
### 2. `separate()`:
請觀察 `df_education_long` 當中 `key` 欄位的值,將 key 利用 `separate()` 切開成四個欄位,分別是`edu`, `level`, `edu_status`, `gender`,各自代表教育前綴詞、學位、教育狀態、性別。最後將結果儲存在 `df_education_long_cut` 當中,並將 `df_education_long_cut` 印出。如果你不懂這邊在說什麼,請參考老師本週第一支影片(R04_1_1 Loading MOI demographic data),基本上就是按照裡面的流程進行。底下會遇到好切跟不好切的情況,遇到不好切的情況時可以使用 `str_replace()` 函數。
提示:
1. 你可以利用 `count()` 觀察 `key` 的結構。舉例來說, `edu_doctor_graduated_m` 應該切成 `edu` = "edu", `level` = "doctor", `edu_status` = "graduated", `gender` = "m"。
2. 不好切的情況(01): `edu_illiterate_f` 代表不識字,沒辦法切成四塊,請想辦法將這個值切成 `edu` = "edu", `level` = "illiterate", `edu_status` = "all", `gender` = "f"。
3. 不好切的情況(02): `edu_juniorcollege_2ys_graduated_m` 裡面多了一個 `_`,同樣沒辦法切成四塊,請想辦法將這個值切成 `edu` = "edu", `level` = "juniorcollege2ys", `edu_status` = "graduated", `gender` = "m"。
4. `str_replace(string = "小軒不喜歡吃肉", pattern = "不喜歡", replacement = "超討厭")` 的意思是把 `string` 參數當中滿足 `pattern` 參數的字串替換成 `replacement` 參數的值,所以結果會是 `"小軒超討厭吃肉"`。
```{r message=FALSE, warning=FALSE}
### 這邊讓你看 key 的長相
# df_education_long %>% count(key)
### count 結果借你看
#> # A tibble: 46 x 2
#> key n
#> * <chr> <int>
#> 1 edu_doctor_graduated_f 7760
#> 2 edu_doctor_graduated_m 7760
#> 3 edu_doctor_ungraduated_f 7760
#> 4 edu_doctor_ungraduated_m 7760
#> 5 edu_illiterate_f 7760
#> 6 edu_illiterate_m 7760
#> 7 edu_junior_graduated_f 7760
#> 8 edu_junior_graduated_m 7760
#> 9 edu_junior_ungraduated_f 7760
#> 10 edu_junior_ungraduated_m 7760
#> # … with 36 more rows
### your code
### your result should be
#> # A tibble: 356,960 x 8
#> district_code site_id village edu level graduate gender value
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <int>
#> 1 65000010001 新北市板橋區 留侯里 edu doctor graduated m 4
#> 2 65000010001 新北市板橋區 留侯里 edu doctor graduated f 0
#> 3 65000010001 新北市板橋區 留侯里 edu doctor ungraduated m 1
#> 4 65000010001 新北市板橋區 留侯里 edu doctor ungraduated f 2
#> 5 65000010001 新北市板橋區 留侯里 edu master graduated m 52
#> 6 65000010001 新北市板橋區 留侯里 edu master graduated f 31
#> 7 65000010001 新北市板橋區 留侯里 edu master ungraduated m 12
#> 8 65000010001 新北市板橋區 留侯里 edu master ungraduated f 7
#> 9 65000010001 新北市板橋區 留侯里 edu university graduated m 150
#> 10 65000010001 新北市板橋區 留侯里 edu university graduated f 167
#> # … with 356,950 more rows
```
### 3. `group_by()` and `summarize()`:
請計算以區域別(site_id) 為單位的教育統計,產出的欄位包含 n_sum(15歲以上現住人口總人數), n_female(女性15歲以上現住人口總人數), n_higher(高等教育總人數, 包含博士、碩士、大學,畢業與肄業皆計入), n_higher_female(女性高等教育總人數), n_self(自學總人數), n_illiterate(不識字總人數),把資料儲存為 `df_education_agg`,並且將 `df_education_agg` 印出。
```{r message=FALSE, warning=FALSE}
### your code
### your result should be
#> # A tibble: 370 x 7
#> site_id n_sum n_female n_higher n_higher_female n_self n_illiterate
#> * <chr> <int> <int> <int> <int> <int> <int>
#> 1 南投縣中寮鄉 13571 6187 2339 1141 38 380
#> 2 南投縣仁愛鄉 13158 6386 2029 1088 31 51
#> 3 南投縣信義鄉 13847 6418 2482 1210 64 76
#> 4 南投縣南投市 87696 44119 28352 13650 88 791
#> 5 南投縣名間鄉 34622 16354 7706 3726 108 306
#> 6 南投縣國姓鄉 17132 7860 2937 1386 34 410
#> 7 南投縣埔里鎮 71529 36009 17679 8941 99 749
#> 8 南投縣水里鄉 15960 7561 3131 1489 38 266
#> 9 南投縣竹山鎮 48789 23780 11115 5336 785 0
#> 10 南投縣草屯鎮 86210 42768 25906 12396 135 1040
#> # … with 360 more rows
```
### 4. data joining:
請以教育資料為基底,串接第十案公投的資料。串接後會發現兩邊資料大部分可以完成串接,但有少部分會有問題,請檢查到底問題在哪裡,將問題排除後,將串好的資料儲存成 `df_ref_edu_join`,再將 `df_ref_edu_join` 印出。
提示:
1. 你可以在串好之後,利用 `filter(is.na(填你要檢查的欄位))` 檢查是哪些列有問題。
2. 發現 `site_id` 的問題之後,你會回頭重新利用 `group_by()` 和 `summarize()` 計算教育統計,再去 join 公投案資料。
```{r message=FALSE, warning=FALSE}
### 這裡不要動
ref10 <- read_csv("data/AS04/ref10_town.csv") %>%
select(county = 縣市, town = 鄉鎮市區,
agree = 同意票數, disagree = 不同意票數,
legalVote = 有效票數, illegalVote = 無效票數,
vote = 投票數, legalPopulation = 投票權人數) %>%
mutate(site_id = str_c(county, town)) %>%
select(-c(county, town)) %>%
drop_na(site_id) %>% select(site_id, everything())
### your code
### your result should be
#> # A tibble: 368 x 13
#> site_id n_sum n_female n_higher n_higher_female n_self n_illiterate agree
#> <chr> <int> <int> <int> <int> <int> <int> <dbl>
#> 1 南投縣中寮鄉… 13571 6187 2339 1141 38 380 5748
#> 2 南投縣仁愛鄉… 13158 6386 2029 1088 31 51 5702
#> 3 南投縣信義鄉… 13847 6418 2482 1210 64 76 6891
#> 4 南投縣南投市… 87696 44119 28352 13650 88 791 37547
#> 5 南投縣名間鄉… 34622 16354 7706 3726 108 306 14533
#> 6 南投縣國姓鄉… 17132 7860 2937 1386 34 410 7089
#> 7 南投縣埔里鎮… 71529 36009 17679 8941 99 749 29571
#> 8 南投縣水里鄉… 15960 7561 3131 1489 38 266 6392
#> 9 南投縣竹山鎮… 48789 23780 11115 5336 785 0 19254
#> 10 南投縣草屯鎮… 86210 42768 25906 12396 135 1040 35215
#> # … with 358 more rows, and 5 more variables: disagree <dbl>, legalVote <dbl>,
#> # illegalVote <dbl>, vote <dbl>, legalPopulation <dbl>
```
### 5. data visualization:
請利用 `df_ref_edu_join`,計算 `agreeRate`(分母是 `legalVote`,分子是 `agree`) 以及 `per_higher` (分母是 `n_sum`,分子是 `n_higher`) ,接著利用 ggplot 和 geom_jitter() 畫出 x 軸 = `per_higher`, y 軸 = `agreeRate` 的散點圖,並用三行以內的文字**描述你的詮釋**。若不知道怎麼畫,請參考老師本週第四支影片(R04_1_4 Joining demographic and referendum data) 最後面。
```{r}
### your code
### your result should be
# 自己畫就好唷
### your text
# 記得寫你的詮釋!!!
```