這份作業希望能夠讓你熟悉操作資料的流程,利用這兩週所學的
filter()
, mutate()
, select()
,
group_by()
, summarize()
, join()
,
spread()
, gather()
(或是
pivot_wider()
跟 pivot_longer()
)
等動詞完成任務。請一律印出 tibble,你可以利用 as_tibble()
將 dataframe 轉換成 tibble。
資料介紹:這份資料來自台北市捷運,內容是 111 年 2 月台北捷運各站的出站統計。
### 這邊不要動
library(tidyverse)
<- read_csv("data/AS03/202202_mrt_出站.csv")
df_mrt
### 給你看資料長這樣
%>% head(5) df_mrt
#> # A tibble: 5 × 120
#> date 松山機場 中山國中 南京復興 忠孝復興 大安 科技大樓 六張犁 麟光
#> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 2022-02-01 1202 2640 5926 16323 3423 2511 2539 1653
#> 2 2022-02-02 1532 3232 7542 17686 4565 2992 3127 1905
#> 3 2022-02-03 1181 3154 8013 18500 4475 2995 3009 1722
#> 4 2022-02-04 1097 4314 10660 23967 6495 3887 3891 2114
#> 5 2022-02-05 1290 5127 12355 26886 7662 4740 4685 2508
#> # … with 111 more variables: 辛亥 <dbl>, 萬芳醫院 <dbl>, 萬芳社區 <dbl>,
#> # 木柵 <dbl>, 動物園 <dbl>, 大直 <dbl>, 劍南路 <dbl>, 西湖 <dbl>, 港墘 <dbl>,
#> # 文德 <dbl>, 內湖 <dbl>, 大湖公園 <dbl>, 葫洲 <dbl>, 東湖 <dbl>,
#> # 南港軟體園區 <dbl>, 南港展覽館 <dbl>, 小碧潭 <dbl>, 新店 <dbl>,
#> # 新店區公所 <dbl>, 七張 <dbl>, 大坪林 <dbl>, 景美 <dbl>, 萬隆 <dbl>,
#> # 公館 <dbl>, 台電大樓 <dbl>, 古亭 <dbl>, 中正紀念堂 <dbl>, 小南門 <dbl>,
#> # 頂溪 <dbl>, 永安市場 <dbl>, 景安 <dbl>, 南勢角 <dbl>, 台大醫院 <dbl>, …
gather()
or pivot_longer()
:請將 df_mrt
轉成長表格後印出,站名儲存到
station
,出站人口儲存到 n
,並將結果儲存到
df_mrt_longer
中,印出前 5 列
### your code
<- df_mrt %>% pivot_longer(cols = -1, names_to = "station", values_to = "n")
df_mrt_longer %>% head(5)
df_mrt_longer
### 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
#> # 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
group_by()
和 summarize()
:請利用 df_mrt_longer
計算台北捷運每日的總出站人數,並將結果由總出站人數大到小排列
### your code
%>% group_by(date) %>%
df_mrt_longer summarise(n = sum(n)) %>% arrange(desc(n))
### 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
#> # 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
group_by()
和 summarize()
:請利用 df_mrt_longer
計算每個捷運站出站人數的平均數與中位數,平均數存在
avg
,中位數存在 median
,把處理後的資料儲存在
df_mrt_longer_agg
後,印出前 3 列
### your code
<- df_mrt_longer %>% group_by(station) %>%
df_mrt_longer_agg summarise(avg = mean(n), median = median(n))
%>% head(3)
df_mrt_longer_agg
### 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.
#> # A tibble: 3 × 3
#> station avg median
#> <chr> <dbl> <dbl>
#> 1 BL板橋 28518. 30178.
#> 2 Y板橋 6413. 6495
#> 3 七張 11492. 12912.
mutate()
和 arrange()
:請在 df_mrt_longer_agg
中新增 diff
欄位,以平均數減去中位數,再依照 diff
由大到小排列。印出前
3 列後,用一句話詮釋前三列的結果
### your code
%>% mutate(diff = avg - median) %>%
df_mrt_longer_agg arrange(desc(diff)) %>% head(3)
### 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.
#> # A tibble: 3 × 4
#> station avg median diff
#> <chr> <dbl> <dbl> <dbl>
#> 1 動物園 4968. 3946. 1021
#> 2 淡水 24617. 23978 639.
#> 3 輔大 7276. 6940 336.
資料介紹:這份資料改編自台大 105 學年度雙主修的榜單,請參考雙主修榜單,但是 105 年的掛了,給你看 108年 作為參考。
### 這邊不要動
<- read_csv("data/AS03/df_college_join.csv")
df_college_join <- read_csv("data/AS03/df_dmajor_105.csv")
df_dmajor_105
### 給你看資料長這樣
%>% head(5)
df_dmajor_105 %>% head(5) df_college_join
#> # A tibble: 5 × 7
#> ID_year ID_dept ID_order dept_original grade name dept_dmajor
#> <chr> <chr> <chr> <chr> <dbl> <chr> <chr>
#> 1 <NA> <NA> <NA> <NA> NA 陳O薇 <NA>
#> 2 <NA> <NA> <NA> 資工所 NA 楊O晨 新聞所
#> 3 B02 A01 314 法律系財法組 4 蔡O軒 哲學系
#> 4 B01 B01 076 法律系財法組 4 呂O禹 生科系
#> 5 B03 A01 361 法律系財法組 3 于O庭 哲學系
#> # A tibble: 5 × 2
#> college dept
#> <chr> <chr>
#> 1 公衛學院 公衛系
#> 2 工學院 化工系
#> 3 工學院 土木系
#> 4 工學院 工科海洋系
#> 5 工學院 材料系
NA
這題沒有要做,給你參考用!
### 看是誰有 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
# 全部踢掉
%>% 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() df_dmajor_105
#> # A tibble: 4 × 7
#> ID_year ID_dept ID_order dept_original grade name dept_dmajor
#> <chr> <chr> <chr> <chr> <dbl> <chr> <chr>
#> 1 <NA> <NA> <NA> <NA> NA 陳O薇 <NA>
#> 2 <NA> <NA> <NA> 資工所 NA 楊O晨 新聞所
#> 3 B00 000 000 <NA> 7 <NA> <NA>
#> 4 <NA> <NA> <NA> <NA> NA <NA> <NA>
#> # A tibble: 5 × 7
#> ID_year ID_dept ID_order 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 B03 A01 345 法律系財法組 3 黃O文 社會系
#> 5 B04 A01 349 法律系財法組 2 蔣O謙 歷史系
#> # A tibble: 5 × 7
#> ID_year ID_dept ID_order dept_original grade name dept_dmajor
#> <chr> <chr> <chr> <chr> <dbl> <chr> <chr>
#> 1 missing <NA> <NA> unknown 0 陳O薇 <NA>
#> 2 missing <NA> <NA> 資工所 0 楊O晨 新聞所
#> 3 B02 A01 314 法律系財法組 4 蔡O軒 哲學系
#> 4 B01 B01 076 法律系財法組 4 呂O禹 生科系
#> 5 B03 A01 361 法律系財法組 3 于O庭 哲學系
group_by()
and summarize()
:利用 df_dmajor_105
請幫我找出向外雙主修人數最多的系所
### your code
%>%
df_dmajor_105 group_by(dept_original) %>%
summarise(n = n()) %>%
ungroup() %>%
filter(n == max(n))
### result
#> # A tibble: 1 × 2
#> dept_original n
#> <chr> <int>
#> 1 森林環資系 27
#> # A tibble: 1 × 2
#> dept_original n
#> <chr> <int>
#> 1 森林環資系 27
join()
and count()
and
mutate()
:利用 df_dmajor_105
和 df_college_join
串接,請幫我計算各學院向外雙主修的人數以及佔比,看哪個學院向外雙主修的佔比最多,請由多到少排列
* 提醒:df_dmajor_105
和 df_college_join
兩個資料表中,都有科系的欄位,只是名字不一樣,可以在 join 的時候用
by
參數指名,也可以先更改欄位名稱之後再 join
### your code
%>%
df_dmajor_105 left_join(df_college_join, by = c("dept_original" = "dept")) %>%
count(college) %>%
mutate(per = n/sum(n)) %>%
arrange(desc(per))
### 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
#> # 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
unite()
和 separte()
:A. 現在的學號分開了,請幫我用 "-"
拼起來,欄位命名為
ID
,存成 df_dmajor_105_tmp
後印出前 3 列
B. 再幫我把 df_dmajor_105_tmp
分開成三個欄位分別叫做
“first”, “second”, “third”,分開以後回到一個人生活印出前 3 列
### your code (A)
<- df_dmajor_105 %>% unite(col = "ID", c(ID_year, ID_dept, ID_order), sep = "-")
df_dmajor_105_tmp %>% head(3)
df_dmajor_105_tmp
### 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)
%>% separate(col = ID, into = c("first", "second", "third"), sep = "-") %>%
df_dmajor_105_tmp head(3)
### 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庭 哲學系
#> # 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庭 哲學系
#> # 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庭 哲學系
join()
and mutate()
:請幫我串接 df_dmajor_105
和
df_college_join
,接著計算各學院之間雙主修的人數,將結果儲存成
df_dmajor_105_college
並印出。
### your code
<- df_dmajor_105 %>%
df_dmajor_105_college left_join(df_college_join, by = c("dept_original" = "dept")) %>%
rename(college_original = college) %>%
left_join(df_college_join, by = c("dept_dmajor" = "dept")) %>%
rename(college_dmajor = college) %>%
count(college_original, college_dmajor)
df_dmajor_105_college### 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
#> # 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
spread()
or pivot_wider()
:請將 df_dmajor_105_college
轉成寬表格後印出,表格中的值使用
n
,看各系所之間互相雙主修的情形
### your code
%>%
df_dmajor_105_college pivot_wider(names_from = college_dmajor, values_from = n, values_fill = list(n = 0))
### 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>
#> # 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>