這份作業希望能夠讓你熟悉於資料處理(data manipulation),利用這兩週所學的 filter, mutate, select, group by, summarize, join, pivot 等動詞完成任務。請一律印出 tibble(),你可以利用 as_tibble()
將 dataframe 轉換成 tibble。作業的滿分為 100 分。
資料內容是台大 105 學年度雙主修的榜單,請參考雙主修榜單,但是 105 年的掛了,給你看 108年 的參考,為了上課需要,將內容做了一些改動喔!
### 這邊不要動
library(tidyverse)
<- read_csv("data/Lab05/df_college_join.csv")
df_college_join <- read_csv("data/Lab05/df_dmajor_105.csv")
df_dmajor_105
### 給你看資料長這樣
%>% head(5)
df_dmajor_105 %>% head(5) df_college_join
#> # A tibble: 5 x 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 x 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 x 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 x 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 x 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庭 哲學系
unite()
和 separte()
:A. 現在的學號分開了,請幫我用 "-"
拼起來,欄位命名為 ID
,存成 df_dmajor_105_tmp
後印出
B. 再幫我把 df_dmajor_105_tmp
分開成三個欄位分別叫做 “ID_year”, “ID_dept”, “ID_order”,分開以後回到一個人生活
這題給你看答案喔!
### your code (A)
<- df_dmajor_105 %>% unite(col = "ID", c(ID_year, ID_dept, ID_order), sep = "-")
df_dmajor_105_tmp
df_dmajor_105_tmp
### your result should be
#> # A tibble: 498 x 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庭 哲學系
#> 4 B03-A01-345 法律系財法組 3 黃O文 社會系
#> 5 B04-A01-349 法律系財法組 2 蔣O謙 歷史系
#> 6 B04-A01-326 法律系財法組 2 卓O廷 會計系
#> 7 B03-A01-305 法律系財法組 2 黃O晴 財金系
#> 8 B02-A01-217 法律系司法組 4 曾O博 哲學系
#> 9 B02-A01-214 法律系司法組 4 張O銘 經濟系
#> 10 B01-303-022 法律系司法組 4 蔣O郁 經濟系
#> # … with 488 more rows
### your code (B)
%>% separate(col = ID, into = c("ID_year", "ID_dept", "ID_order"), sep = "-")
df_dmajor_105_tmp
### your result should be
#> # A tibble: 498 x 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謙 歷史系
#> 6 B04 A01 326 法律系財法組 2 卓O廷 會計系
#> 7 B03 A01 305 法律系財法組 2 黃O晴 財金系
#> 8 B02 A01 217 法律系司法組 4 曾O博 哲學系
#> 9 B02 A01 214 法律系司法組 4 張O銘 經濟系
#> 10 B01 303 022 法律系司法組 4 蔣O郁 經濟系
#> # … with 488 more rows
#> # A tibble: 498 x 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庭 哲學系
#> 4 B03-A01-345 法律系財法組 3 黃O文 社會系
#> 5 B04-A01-349 法律系財法組 2 蔣O謙 歷史系
#> 6 B04-A01-326 法律系財法組 2 卓O廷 會計系
#> 7 B03-A01-305 法律系財法組 2 黃O晴 財金系
#> 8 B02-A01-217 法律系司法組 4 曾O博 哲學系
#> 9 B02-A01-214 法律系司法組 4 張O銘 經濟系
#> 10 B01-303-022 法律系司法組 4 蔣O郁 經濟系
#> # … with 488 more rows
#> # A tibble: 498 x 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謙 歷史系
#> 6 B04 A01 326 法律系財法組 2 卓O廷 會計系
#> 7 B03 A01 305 法律系財法組 2 黃O晴 財金系
#> 8 B02 A01 217 法律系司法組 4 曾O博 哲學系
#> 9 B02 A01 214 法律系司法組 4 張O銘 經濟系
#> 10 B01 303 022 法律系司法組 4 蔣O郁 經濟系
#> # … with 488 more rows
group_by()
and summarize()
:利用 df_dmajor_105
A. 請幫我找出向外雙主修人數最多的系所
B. 請幫我找出向外雙主修科系最多元的系所
這題給你看答案喔!
### your code (A)
%>%
df_dmajor_105 group_by(dept_original) %>%
summarise(n = n()) %>%
ungroup() %>%
filter(n == max(n))
### your result should be
#> # A tibble: 1 x 2
#> dept_original n
#> <chr> <int>
#> 1 森林環資系 27
### your code (B)
%>%
df_dmajor_105 group_by(dept_original) %>%
summarise(n_major = n_distinct(dept_dmajor)) %>%
ungroup() %>%
filter(n_major == max(n_major))
### your result should be
#> # A tibble: 1 x 2
#> dept_original n_major
#> <chr> <int>
#> 1 森林環資系 16
#> # A tibble: 1 x 2
#> dept_original n
#> <chr> <int>
#> 1 森林環資系 27
#> # A tibble: 1 x 2
#> dept_original n_major
#> <chr> <int>
#> 1 森林環資系 16
join()
and count()
and mutate()
:利用 df_dmajor_105
和 df_college_join
串接,請幫我計算各學院向外雙主修的人數以及佔據總體的比例
### your code
### your result should be
#> # A tibble: 10 x 3
#> college n per
#> * <chr> <int> <dbl>
#> 1 公衛學院 1 0.00201
#> 2 工學院 30 0.0602
#> 3 文學院 105 0.211
#> 4 法學院 22 0.0442
#> 5 理學院 54 0.108
#> 6 生農學院 102 0.205
#> 7 社科院 84 0.169
#> 8 管理學院 50 0.100
#> 9 醫學院 20 0.0402
#> 10 電資學院 30 0.0602
join()
and mutate()
:利用 df_dmajor_105
和 df_college_join
串接,請幫我計算各學院之間雙主修的人數,並且增加一個欄位,以原本學院為基礎,計算該學院雙主修到各學院的人數佔比。舉例來說,社科院有 5 人雙文學院、3 人雙工學院、2 人雙管理學院,請幫我計算出這些人數,以及社科雙文學院的佔比為 50%、雙工學院的佔比為 30%、雙管理學院的佔比為 20%,最後將結果儲存成 df_dmajor_105_college
並印出。
### your code
### your result should be
#> # A tibble: 70 x 4
#> # Groups: college_original [10]
#> college_original college_dmajor n per
#> <chr> <chr> <int> <dbl>
#> 1 公衛學院 生科學院 1 1
#> 2 工學院 工學院 6 0.2
#> 3 工學院 文學院 3 0.1
#> 4 工學院 理學院 7 0.233
#> 5 工學院 生農學院 1 0.0333
#> 6 工學院 社科院 7 0.233
#> 7 工學院 管理學院 3 0.1
#> 8 工學院 電資學院 3 0.1
#> 9 文學院 公衛學院 1 0.00952
#> 10 文學院 工學院 1 0.00952
#> # … with 60 more rows
pivot_wider()
:請將 df_dmajor_105_college
轉成寬表格後印出,表格中的值使用 per
, n
可以刪掉了
### your code
### your result should be
#> # A tibble: 10 x 11
#> # Groups: college_original [10]
#> college_original 生科學院 工學院 文學院 理學院 生農學院 社科院 管理學院
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 公衛學院 1 0 0 0 0 0 0
#> 2 工學院 0 0.2 0.1 0.233 0.0333 0.233 0.1
#> 3 文學院 0.00952 0.00952 0.419 0.0286 0.0571 0.381 0.0571
#> 4 法學院 0.0455 0 0.455 0 0.0455 0.318 0.136
#> 5 理學院 0.0370 0.148 0.148 0.315 0.111 0.148 0.0185
#> 6 生農學院 0.0490 0.0882 0.108 0.127 0.382 0.186 0.0294
#> 7 社科院 0 0.0119 0.155 0.0714 0.0595 0.440 0.0952
#> 8 管理學院 0.08 0 0.26 0.14 0.02 0.2 0.2
#> 9 醫學院 0 0 0.15 0.15 0.2 0.15 0.1
#> 10 電資學院 0 0.0333 0.1 0.5 0.167 0.0333 0.167
#> # … with 3 more variables: 電資學院 <dbl>, 公衛學院 <dbl>, 法學院 <dbl>