-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAS03_Homework_data-manipulation-joining.Rmd
More file actions
269 lines (208 loc) · 9.18 KB
/
AS03_Homework_data-manipulation-joining.Rmd
File metadata and controls
269 lines (208 loc) · 9.18 KB
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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
---
title: "AS03_Homework_Data-Manipulation-Joining"
author: "你是誰 R10342000 新聞所碩五"
date: "2021/03/24"
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)
```
## 作業目的:
這份作業希望能夠讓你熟悉操作資料的流程,利用這兩週所學的 `filter()`, `mutate()`, `select()`, `group_by()`, `summarize()`, `join()`, `spread()`, `gather()` (或是 `pivot_wider()` 跟 `pivot_longer()` ) 等動詞完成任務。請一律印出 tibble,你可以利用 `as_tibble()` 將 dataframe 轉換成 tibble。
## A. Data Manipulation
資料介紹:這份資料來自[台北市捷運](https://www.metro.taipei/cp.aspx?n=FF31501BEBDD0136),內容是 111 年 2 月台北捷運各站的出站統計。
```{r message=FALSE, warning=FALSE}
### 這邊不要動
library(tidyverse)
df_mrt <- read_csv("data/AS03/202202_mrt_出站.csv")
### 給你看資料長這樣
df_mrt %>% head(5)
```
### 1. `gather()` or `pivot_longer()`:
請將 `df_mrt` 轉成長表格後印出,站名儲存到 `station`,出站人口儲存到 `n`,並將結果儲存到 `df_mrt_longer` 中,印出前 5 列
```{r message=FALSE,warning=FALSE}
### your code
### result
#> # A tibble: 5 × 3
#> date station n
#> <date> <chr> <dbl>
#> 1 2022-02-01 松山機場 1202
#> 2 2022-02-01 中山國中 2640
#> 3 2022-02-01 南京復興 5926
#> 4 2022-02-01 忠孝復興 16323
#> 5 2022-02-01 大安 3423
```
### 2. `group_by()` 和 `summarize()`:
請利用 `df_mrt_longer` 計算台北捷運每日的總出站人數,並將結果由總出站人數大到小排列
```{r message=FALSE,warning=FALSE}
### your code
### result
#> # A tibble: 28 × 2
#> date n
#> <date> <dbl>
#> 1 2022-02-25 2108650
#> 2 2022-02-18 1952448
#> 3 2022-02-24 1952311
#> 4 2022-02-23 1943921
#> 5 2022-02-22 1928146
#> 6 2022-02-11 1875738
#> 7 2022-02-21 1867167
#> 8 2022-02-17 1824938
#> 9 2022-02-16 1819771
#> 10 2022-02-14 1803972
#> # … with 18 more rows
```
### 3. `group_by()` 和 `summarize()`:
請利用 `df_mrt_longer` 計算每個捷運站出站人數的平均數與中位數,平均數存在 `avg`,中位數存在 `median`,把處理後的資料儲存在 `df_mrt_longer_agg` 後,印出前 3 列
```{r message=FALSE,warning=FALSE}
### your code
### result
#> # A tibble: 3 × 3
#> station avg median
#> <chr> <dbl> <dbl>
#> 1 BL板橋 28518. 30178.
#> 2 Y板橋 6413. 6495
#> 3 七張 11492. 12912.
```
### 4. `mutate()` 和 `arrange()`:
請在 `df_mrt_longer_agg` 中新增 `diff` 欄位,以平均數減去中位數,再依照 `diff` 由大到小排列。印出前 3 列後,用一句話詮釋前三列的結果
```{r message=FALSE,warning=FALSE}
### your code
### result
#> # A tibble: 3 × 4
#> station avg median diff
#> <chr> <dbl> <dbl> <dbl>
#> 1 動物園 4968. 3946. 1021
#> 2 淡水 24617. 23978 639.
#> 3 輔大 7276. 6940 336.
```
## B. Data Manipulation and Joining
資料介紹:這份資料改編自台大 105 學年度雙主修的榜單,請參考[雙主修榜單](https://reg227.aca.ntu.edu.tw/TMD/stuquery/doc/105%E9%9B%99%E4%B8%BB%E4%BF%AE%E6%A6%9C%E5%96%AE.pdf),但是 105 年的掛了,給你看 [108年](http://reg227.aca.ntu.edu.tw/tmd/stuquery/doc/108%E9%9B%99%E4%B8%BB%E4%BF%AE%E6%A6%9C%E5%96%AE.pdf) 作為參考。
```{r message=FALSE, warning=FALSE}
### 這邊不要動
df_college_join <- read_csv("data/AS03/df_college_join.csv")
df_dmajor_105 <- read_csv("data/AS03/df_dmajor_105.csv")
### 給你看資料長這樣
df_dmajor_105 %>% head(5)
df_college_join %>% head(5)
```
### 0. 尋找並處理 `NA`
這題沒有要做,給你參考用!
```{r message=FALSE, warning=FALSE}
### 看是誰有 NA
# 一個一個看
df_dmajor_105 %>%
filter(is.na(ID_year)|is.na(ID_dept)|is.na(ID_order)|is.na(dept_original)|is.na(grade)|is.na(name)|is.na(dept_dmajor))
# 進階
# df_dmajor_105 %>% anti_join(df_dmajor_105 %>% drop_na())
# 進階
# df_dmajor_105 %>% filter(if_any(everything(), is.na))
### 處理 NA
# 全部踢掉
df_dmajor_105 %>% drop_na() %>% head(5)
# 按照預設值修改
df_dmajor_105 %>% replace_na(list(ID_year = "missing", dept_original = "unknown", grade = 0)) %>% head(5)
### 因為這題資料的缺失值會影響結果計算,因此全數踢掉
df_dmajor_105 <- df_dmajor_105 %>% drop_na()
```
### 1. `group_by()` and `summarize()`:
利用 `df_dmajor_105` 請幫我找出**向外**雙主修**人數最多**的系所
*向外指的是該系有學生雙主修其他科系
*本題等於要找哪個系有最多學生雙主修其他科系
```{r message=FALSE, warning=FALSE}
### your code
### result
#> # A tibble: 1 × 2
#> dept_original n
#> <chr> <int>
#> 1 森林環資系 27
```
### 2. `join()` and `count()` and `mutate()`:
利用 `df_dmajor_105` 和 `df_college_join` 串接,請幫我計算各學院**向外**雙主修的人數以及佔比,看哪個學院**向外**雙主修的佔比最多,請由多到少排列
*提醒:`df_dmajor_105` 和 `df_college_join` 兩個資料表中,都有科系的欄位,只是名字不一樣,可以在 join 的時候用 `by` 參數指名,也可以先更改欄位名稱之後再 join
```{r message=FALSE, warning=FALSE}
### your code
### your result should be
#> # A tibble: 10 × 3
#> college n per
#> <chr> <int> <dbl>
#> 1 文學院 105 0.211
#> 2 生農學院 102 0.205
#> 3 社科院 84 0.169
#> 4 理學院 54 0.108
#> 5 管理學院 50 0.100
#> 6 工學院 30 0.0602
#> 7 電資學院 30 0.0602
#> 8 法學院 22 0.0442
#> 9 醫學院 20 0.0402
#> 10 公衛學院 1 0.00201
```
### 3. `unite()` 和 `separte()`:
A. 現在的學號分開了,請幫我用 `"-"` 拼起來,欄位命名為 `ID`,存成 `df_dmajor_105_tmp` 後印出前 3 列
B. 再幫我把 `df_dmajor_105_tmp` 分開成三個欄位分別叫做 "first", "second", "third",分開以後<span style="color: white;">回到一個人生活</span>印出前 3 列
```{r message=FALSE, warning=FALSE}
### your code (A)
### result
#> # A tibble: 3 × 5
#> ID dept_original grade name dept_dmajor
#> <chr> <chr> <dbl> <chr> <chr>
#> 1 B02-A01-314 法律系財法組 4 蔡O軒 哲學系
#> 2 B01-B01-076 法律系財法組 4 呂O禹 生科系
#> 3 B03-A01-361 法律系財法組 3 于O庭 哲學系
### your code (B)
### result
#> # A tibble: 3 × 7
#> first second third dept_original grade name dept_dmajor
#> <chr> <chr> <chr> <chr> <dbl> <chr> <chr>
#> 1 B02 A01 314 法律系財法組 4 蔡O軒 哲學系
#> 2 B01 B01 076 法律系財法組 4 呂O禹 生科系
#> 3 B03 A01 361 法律系財法組 3 于O庭 哲學系
```
### 4. `join()` and `mutate()`:
請幫我串接 `df_dmajor_105` 和 `df_college_join`,接著計算各學院之間雙主修的人數,將結果儲存成 `df_dmajor_105_college` 並印出。
```{r message=FALSE, warning=FALSE}
### your code
### your result should be
#> # A tibble: 70 × 3
#> college_original college_dmajor n
#> <chr> <chr> <int>
#> 1 公衛學院 生科學院 1
#> 2 工學院 工學院 6
#> 3 工學院 文學院 3
#> 4 工學院 理學院 7
#> 5 工學院 生農學院 1
#> 6 工學院 社科院 7
#> 7 工學院 管理學院 3
#> 8 工學院 電資學院 3
#> 9 文學院 公衛學院 1
#> 10 文學院 工學院 1
#> # … with 60 more rows
```
### 5. `spread()` or `pivot_wider()`:
請將 `df_dmajor_105_college` 轉成寬表格後印出,表格中的值使用 `n`,看各系所之間互相雙主修的情形
```{r message=FALSE,warning=FALSE}
### your code
### your result should be
#> # A tibble: 10 × 11
#> college_original 生科學院 工學院 文學院 理學院 生農學院 社科院 管理學院
#> <chr> <int> <int> <int> <int> <int> <int> <int>
#> 1 公衛學院 1 0 0 0 0 0 0
#> 2 工學院 0 6 3 7 1 7 3
#> 3 文學院 1 1 44 3 6 40 6
#> 4 法學院 1 0 10 0 1 7 3
#> 5 理學院 2 8 8 17 6 8 1
#> 6 生農學院 5 9 11 13 39 19 3
#> 7 社科院 0 1 13 6 5 37 8
#> 8 管理學院 4 0 13 7 1 10 10
#> 9 醫學院 0 0 3 3 4 3 2
#> 10 電資學院 0 1 3 15 5 1 5
#> # … with 3 more variables: 電資學院 <int>, 公衛學院 <int>, 法學院 <int>
```