作業目的: Data Manipulation and Joining

這份作業希望能夠讓你熟悉於資料處理(data manipulation),利用這兩週所學的 filter, mutate, select, group by, summarize, join, pivot 等動詞完成任務。請一律印出 tibble(),你可以利用 as_tibble() 將 dataframe 轉換成 tibble。作業的滿分為 100 分。

資料內容是台大 105 學年度雙主修的榜單,請參考雙主修榜單,但是 105 年的掛了,給你看 108年 的參考,為了上課需要,將內容做了一些改動喔!

作業: Data Manipulation and Joining

### 這邊不要動
library(tidyverse)
df_college_join <- read_csv("data/Lab05/df_college_join.csv")
df_dmajor_105 <- read_csv("data/Lab05/df_dmajor_105.csv")

### 給你看資料長這樣
df_dmajor_105 %>% head(5)
df_college_join %>% head(5)
#> # 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 工學院   材料系

0. 練習尋找並處理 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
# 全部踢掉
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()
#> # 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庭 哲學系

1. 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_tmp <- df_dmajor_105 %>% unite(col = "ID", c(ID_year, ID_dept, ID_order), sep = "-")
df_dmajor_105_tmp
### your code (B)
df_dmajor_105_tmp %>% separate(col = ID, into = c("ID_year", "ID_dept", "ID_order"), sep = "-")
#> # 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

2. 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 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
#>   <chr>         <int>
#> 1 森林環資系       27
#> # A tibble: 1 x 2
#>   dept_original n_major
#>   <chr>           <int>
#> 1 森林環資系         16

3. join() and count() and mutate():

利用 df_dmajor_105df_college_join 串接,請幫我計算各學院向外雙主修的人數以及佔據總體的比例

### your code
df_dmajor_105 %>%
  left_join(df_college_join, by = c("dept_original" = "dept")) %>%
  count(college) %>%
  mutate(per = n/sum(n))

### 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

4. join() and mutate():

利用 df_dmajor_105df_college_join 串接,請幫我計算各學院之間雙主修的人數,並且增加一個欄位,以原本學院為基礎,計算該學院雙主修到各學院的人數佔比。舉例來說,社科院有 5 人雙文學院、3 人雙工學院、2 人雙管理學院,請幫我計算出這些人數,以及社科雙文學院的佔比為 50%、雙工學院的佔比為 30%、雙管理學院的佔比為 20%,最後將結果儲存成 df_dmajor_105_college 並印出。

### your code
df_dmajor_105_college <- df_dmajor_105 %>%
  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) %>%
  group_by(college_original) %>%
  mutate(per = n/sum(n))

df_dmajor_105_college
### 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

5. pivot_wider()

請將 df_dmajor_105_college 轉成寬表格後印出,表格中的值使用 pern 可以刪掉了

### your code
df_dmajor_105_college %>% select(-n) %>%
  pivot_wider(names_from = college_dmajor, values_from = per, values_fill = list(per = 0))

### 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>