1 基本題 (共 100 分)

1.1 Data frame (共 60 分)

# 請勿更動此 code chunk
library(tibble)
df <- as_tibble(ToothGrowth)
df
#> # A tibble: 60 x 3
#>      len supp   dose
#>    <dbl> <fct> <dbl>
#>  1   4.2 VC      0.5
#>  2  11.5 VC      0.5
#>  3   7.3 VC      0.5
#>  4   5.8 VC      0.5
#>  5   6.4 VC      0.5
#>  6  10   VC      0.5
#>  7  11.2 VC      0.5
#>  8  11.2 VC      0.5
#>  9   5.2 VC      0.5
#> 10   7   VC      0.5
#> # … with 50 more rows

此題使用的是 R 的內建資料 ToothGrowth,請使用 ?ToothGrowth 閱讀此資料集的說明,並使用上課講到的指令 (e.g. dim(), glimpse(), View(), …) 幫助自己熟悉這份資料。

1.1.1 Subsetting I (20 分)

請從 df 中 (1) 篩選出 supp 變項為 VC 的所有觀察值,並 (2) 只保留 lensupp 這兩個變項。

# Write your code here
subset(df, supp == "VC")[ ,1:2]
# should print out:
#> # A tibble: 30 x 2
#>      len supp 
#>    <dbl> <fct>
#>  1   4.2 VC   
#>  2  11.5 VC   
#>  3   7.3 VC   
#>  4   5.8 VC   
#>  5   6.4 VC   
#>  6  10   VC   
#>  7  11.2 VC   
#>  8  11.2 VC   
#>  9   5.2 VC   
#> 10   7   VC   
#> # … with 20 more rows
#> # A tibble: 30 x 2
#>      len supp 
#>    <dbl> <fct>
#>  1   4.2 VC   
#>  2  11.5 VC   
#>  3   7.3 VC   
#>  4   5.8 VC   
#>  5   6.4 VC   
#>  6  10   VC   
#>  7  11.2 VC   
#>  8  11.2 VC   
#>  9   5.2 VC   
#> 10   7   VC   
#> # … with 20 more rows

1.1.2 Subsetting II (20 分)

請從 df 中篩選出 (1) supp 變項為 VC 且 (2) len 小於 25 的所有觀察值。

# Write your code here
subset(df, supp == "VC" & len < 25)
# should print out:
#> # A tibble: 24 x 3
#>      len supp   dose
#>    <dbl> <fct> <dbl>
#>  1   4.2 VC      0.5
#>  2  11.5 VC      0.5
#>  3   7.3 VC      0.5
#>  4   5.8 VC      0.5
#>  5   6.4 VC      0.5
#>  6  10   VC      0.5
#>  7  11.2 VC      0.5
#>  8  11.2 VC      0.5
#>  9   5.2 VC      0.5
#> 10   7   VC      0.5
#> # … with 14 more rows
#> # A tibble: 24 x 3
#>      len supp   dose
#>    <dbl> <fct> <dbl>
#>  1   4.2 VC      0.5
#>  2  11.5 VC      0.5
#>  3   7.3 VC      0.5
#>  4   5.8 VC      0.5
#>  5   6.4 VC      0.5
#>  6  10   VC      0.5
#>  7  11.2 VC      0.5
#>  8  11.2 VC      0.5
#>  9   5.2 VC      0.5
#> 10   7   VC      0.5
#> # … with 14 more rows

1.1.3 Subsetting III (20 分)

請從 df 中篩選出 len + 15 * dose 大於 40 的所有觀察值。

# Write your code here
subset(df, (len + 15 * dose) > 40)
# should print out:
#> # A tibble: 24 x 3
#>      len supp   dose
#>    <dbl> <fct> <dbl>
#>  1  23.6 VC        2
#>  2  18.5 VC        2
#>  3  33.9 VC        2
#>  4  25.5 VC        2
#>  5  26.4 VC        2
#>  6  32.5 VC        2
#>  7  26.7 VC        2
#>  8  21.5 VC        2
#>  9  23.3 VC        2
#> 10  29.5 VC        2
#> # A tibble: 24 x 3
#>      len supp   dose
#>    <dbl> <fct> <dbl>
#>  1  23.6 VC        2
#>  2  18.5 VC        2
#>  3  33.9 VC        2
#>  4  25.5 VC        2
#>  5  26.4 VC        2
#>  6  32.5 VC        2
#>  7  26.7 VC        2
#>  8  21.5 VC        2
#>  9  23.3 VC        2
#> 10  29.5 VC        2
#> # … with 14 more rows

1.2 Modifying Values in Lists (共 40 分)

下方的 member 是實習課使用過的例子。在這題,你的任務是撰寫一個函數 n_years_later() 用來將 member 裡面的成員增加或減少歲數。 n_years_later() 有兩個參數:

  • member_data: list,傳入的 member 資料
  • years: integer, 要增加或減少的歲數

n_years_later() 所回傳的資料跟原本傳入 member_data 參數的資料結構是一樣的,唯一的差別在於原本資料中的 age 會依據傳入 years 參數的值進行更新。

提示:

  1. 修改 list 裡面元素的語法與 vector 類似:

    lst <- list(
      list(first = "Tiger")
    )
    lst
    
    lst[[1]]$first <- "Pooh"
    lst
    #> [[1]]
    #> [[1]]$first
    #> [1] "Tiger"
    #> 
    #> 
    #> [[1]]
    #> [[1]]$first
    #> [1] "Pooh"
  2. 撰寫 n_years_later() 時,需要使用到 for 迴圈或是 lapply(),不可以一個一個修改

# Data 
member <- list(
   list(name = "kai", age = 40),
   list(name = "pooh", age = 20),
   list(name = "tiger", age = 18),
   list(name = "piglet", age = 19)
)
##### Do Not modify the code above #####

n_years_later <- function(member_data, years) {
  # Write your code here
  for (i in seq_along(member_data)) {
    member_data[[i]]$age <- member_data[[i]]$age + years
  }
  as.list(member_data)
}


##### Do Not modify the code below #####
member[[5]] <- list(name = "Obama", age = 59)
for (y in -1:1) {
  lst = n_years_later(member, y)
  print(sapply(lst, function(x) x$age))
}
# Should print out:
#> [1] 39 19 17 18 58
#> [1] 40 20 18 19 59
#> [1] 41 21 19 20 60
#> [1] 39 19 17 18 58
#> [1] 40 20 18 19 59
#> [1] 41 21 19 20 60

2 進階選答題 (共 20 分)

  1. 作業資料夾裡面有份 week3Rclass.csv,請將此份資料讀進 R 成為一個 data.frame,存入變數 cute_cute。(可以使用 R 內建函數或 readr 套件)
# Write your code here
library(readr)
week3Rclass <- read_csv("~/Downloads/hw4-dina496/week3Rclass.csv")
#> 
#> ─ Column specification ────────────────────────────
#> cols(
#>   nickname = col_character(),
#>   gender = col_double(),
#>   grade = col_double(),
#>   q_self = col_double(),
#>   q_teacher = col_double(),
#>   GPA = col_double()
#> )
cute_cute <- data.frame(week3Rclass)
# Do not modify the code below
cute_cute
# Should print out
#> # A tibble: 85 x 6
#>    nickname   gender grade q_self q_teacher   GPA
#>    <chr>       <dbl> <dbl>  <dbl>     <dbl> <dbl>
#>  1 iakuhs          2     5     60        60  4.2 
#>  2 ToMmyDong       1     1    100       100  5   
#>  3 s               2     4     60        90  4   
#>  4 Jhang           1     4     70        85  3.7 
#>  5 Ryan            2     1     80        90  4.05
#>  6 Ycyc            1     4    100        90  4.3 
#>  7 Liuba           1     5     85        90  3.13
#>  8 guest001        2     1     80        80  3.2 
#>  9 WhaDaFuq        1     1     85        80  2.99
#> 10 irenYujing      2     2     90        90  3.86
#> # … with 75 more rows
#>            nickname gender grade q_self q_teacher  GPA
#> 1            iakuhs      2     5     60      60.0 4.20
#> 2         ToMmyDong      1     1    100     100.0 5.00
#> 3                 s      2     4     60      90.0 4.00
#> 4             Jhang      1     4     70      85.0 3.70
#> 5              Ryan      2     1     80      90.0 4.05
#> 6              Ycyc      1     4    100      90.0 4.30
#> 7             Liuba      1     5     85      90.0 3.13
#> 8          guest001      2     1     80      80.0 3.20
#> 9          WhaDaFuq      1     1     85      80.0 2.99
#> 10       irenYujing      2     2     90      90.0 3.86
#> 11         ying-shu      1     3     90      95.0 3.74
#> 12           genius      2     2     75      95.0 3.00
#> 13             dina      1     1     65      90.0 4.07
#> 14       patricia C      1     2     70      50.0 4.19
#> 15       Evan Huang      2     1     80      90.0 4.18
#> 16       Emily Shih      1     2     80     100.0 4.00
#> 17            Timmy      2     2     90      80.0 3.20
#> 18             Shan      2     4     85      80.0 4.00
#> 19 Shinomiya Kaguya      1     4    100      87.0 4.20
#> 20         seashell      2     2     80      80.0 3.50
#> 21               na      2     1    100     100.0 3.70
#> 22            OhYah      2     3     60     100.0 4.23
#> 23              TAT      1     4     75      70.0 3.00
#> 24              QQQ      0     1    100     100.0 3.30
#> 25            Mictu      2     4     70     100.0 4.30
#> 26     1dai1dai1dai      1     1     87      99.0 4.10
#> 27             Cate      2     4     80      90.0 3.90
#> 28         otterson      1     5     99      75.0 4.30
#> 29           Claire      2     2     75      80.0 3.50
#> 30            NTUST      2     2     80      96.0 3.80
#> 31      Anone Anone      2     4     85      80.0 4.10
#> 32           annann      1     1     87      75.0 4.18
#> 33             Kris      1     2     85      90.0 3.81
#> 34          shinyue      1     4     70      95.0 4.03
#> 35             adam      2     1    100     100.0 3.60
#> 36         Clarissa      1     4     85     100.0 4.30
#> 37                K      2     2     70      90.0 3.00
#> 38            Jerry      2     1     65      80.0 4.00
#> 39            jimmy      2     4     64      80.0 4.06
#> 40    kobayashi rin      1     2     75      90.0 3.33
#> 41           bulahi      2     4     60      80.0 4.10
#> 42          Charles      2     1     61      99.9 3.58
#> 43             meow      1     1     78      89.0 3.90
#> 44            Henry      1     4     80     100.0 3.60
#> 45            ariel      1     2     70      90.0 4.00
#> 46           trumpy      0     4     87      99.0 4.00
#> 47            bolee      2     1     70      90.0 3.13
#> 48               mm      1     1     70      60.0 3.33
#> 49            shawn      1     1     80     100.0 3.80
#> 50        KaiSquare      2     3     90      90.0 3.50
#> 51            SeanN      2     3     80     101.0 3.80
#> 52          amychou      1     4     88     100.0 4.10
#> 53          Chiwawa      2     4     60     100.0 3.99
#> 54            lanhi      2     4     80      99.0 4.20
#> 55               Wu      2     2     60      95.0 3.86
#> 56            Jacky      2     4     50      80.0 3.50
#> 57         meowmeow      1     1    100     100.0 4.30
#> 58             eric      2     1     20     100.0 3.14
#> 59                c      1     2     80      80.0 4.22
#> 60               wu      1     2     80      90.0 4.10
#> 61           bearly      2     5     80     100.0 2.70
#> 62             baek      1     4     70      70.0 4.30
#> 63             Boer      1     4     90     100.0 4.10
#> 64            kappa      1     5     50      99.0 4.20
#> 65              hhr      1     4     80      90.0 4.10
#> 66              Lee      2     4     80      90.0 3.98
#> 67              hhl      1     2     80     100.0 4.11
#> 68     peanutbutter      1     1     60      90.0 2.96
#> 69              sam      2     1     60     100.0 3.90
#> 70       ilovesushi      2     2     87      90.0 3.75
#> 71              rox      2     4     80      90.0 4.00
#> 72        godiclili      2     3     30      80.0 4.25
#> 73            afang      1     5     30      30.0 4.00
#> 74           GodTon      2     5     60      90.0 2.00
#> 75         seaotter      2     5     99      87.0 4.30
#> 76  higannotabihito      2     5     30      87.0 3.50
#> 77              wow      2     2    100      99.0 4.00
#> 78            solid      1     5     85      90.0 3.90
#> 79         87heng87      2     2     20      60.0 4.02
#> 80          super q      2     3    100     100.0 4.29
#> 81            kyaya      1     4     82      93.0 3.90
#> 82              amy      2     3    100     100.0 0.00
#> 83              kkk      1     4     80      90.0 3.70
#> 84             kiki      2     2     10     100.0 5.00
#> 85               KH      2     4     50     100.0 3.70
  1. (不可以使用套件,e.g. dplyrdata.table) 請修改以下 data frame 的資料:
  • GPA:超過 4.3 為錯誤資料,請改為缺失值
  • gender:“M” 改為 1、“F” 改為2。其它的則改為 0。注意:gender 資料類型需為 integer。(Hint: 注意 gender 原本的資料類型是沒有教過的 factor)
# Data 
Q_Q = data.frame(
  nickname = c('SeanN', 'solid', 'wow', '87heng87', 'rox', 'Ycyc'),
  gender = c("M", " F", "M", "F", "F", "Stone"),
  grade = c(5, 5, 4, 4, 4, 2),
  q_self = c(95, 98, 85, 86, 87, 78),
  q_teacher = c(95, 98, 85, 86, 87, 87),
  GPA = c(4.8, 4.3, 5.2, 5.5, 4.7, 3.8)
)
####### Do Not modify the code above #########

# Write your code here
for (i in seq_along(Q_Q$GPA)) {
  if (Q_Q$GPA[[i]] > 4.3) {
    Q_Q$GPA[[i]] <- NA
  } else {
    next
  }
}
gender.level <- levels(Q_Q$gender)
levels(Q_Q$gender) <- c(gender.level,0,1,2)
for (i in seq_along(Q_Q$gender)) {
  if (Q_Q$gender[i] == "M") {
    Q_Q$gender[i] <- 1
  } else if (Q_Q$gender[i] == "F") {
    Q_Q$gender[i] <- 2
  } else {
    Q_Q$gender[i] <- 0
  }
}

# Do Not modify the code below
Q_Q
# Should print out
#>   nickname gender grade q_self q_teacher GPA
#> 1    SeanN      1     5     95        95  NA
#> 2    solid      0     5     98        98 4.3
#> 3      wow      1     4     85        85  NA
#> 4 87heng87      2     4     86        86  NA
#> 5      rox      2     4     87        87  NA
#> 6     Ycyc      0     2     78        87 3.8
#>   nickname gender grade q_self q_teacher GPA
#> 1    SeanN      1     5     95        95  NA
#> 2    solid      0     5     98        98 4.3
#> 3      wow      1     4     85        85  NA
#> 4 87heng87      2     4     86        86  NA
#> 5      rox      2     4     87        87  NA
#> 6     Ycyc      0     2     78        87 3.8
  1. (不可以使用套件,e.g. dplyrdata.table) 請在 cute_cute 這個 data frame 裡新增一個 column favorite_word (不可以使用套件,e.g. dplyrdata.table)。在 favorite_word 中:
  • q_self 大於等於 70,favorite_word 的值為 "根本可愛動物區"
  • q_self 小於 70,favorite_word 的值為 "一代一代"
# Write your code here
for (i in seq_along(cute_cute$q_self)) {
  if (cute_cute$q_self[[i]] >= 70) {
    cute_cute$"favorite_word"[[i]] <- "根本可愛動物區"
  } else {
    cute_cute$"favorite_word"[[i]] <- "一代一代"
  }
}
# Do not modify the code below
cute_cute
# Should print out
#> # A tibble: 85 x 7
#>    nickname   gender grade q_self q_teacher   GPA favorite_word 
#>    <chr>       <dbl> <dbl>  <dbl>     <dbl> <dbl> <chr>         
#>  1 iakuhs          2     5     60        60  4.2  一代一代      
#>  2 ToMmyDong       1     1    100       100  5    根本可愛動物區
#>  3 s               2     4     60        90  4    一代一代      
#>  4 Jhang           1     4     70        85  3.7  根本可愛動物區
#>  5 Ryan            2     1     80        90  4.05 根本可愛動物區
#>  6 Ycyc            1     4    100        90  4.3  根本可愛動物區
#>  7 Liuba           1     5     85        90  3.13 根本可愛動物區
#>  8 guest001        2     1     80        80  3.2  根本可愛動物區
#>  9 WhaDaFuq        1     1     85        80  2.99 根本可愛動物區
#> 10 irenYujing      2     2     90        90  3.86 根本可愛動物區
#> # … with 75 more rows
#>            nickname gender grade q_self q_teacher  GPA  favorite_word
#> 1            iakuhs      2     5     60      60.0 4.20       一代一代
#> 2         ToMmyDong      1     1    100     100.0 5.00 根本可愛動物區
#> 3                 s      2     4     60      90.0 4.00       一代一代
#> 4             Jhang      1     4     70      85.0 3.70 根本可愛動物區
#> 5              Ryan      2     1     80      90.0 4.05 根本可愛動物區
#> 6              Ycyc      1     4    100      90.0 4.30 根本可愛動物區
#> 7             Liuba      1     5     85      90.0 3.13 根本可愛動物區
#> 8          guest001      2     1     80      80.0 3.20 根本可愛動物區
#> 9          WhaDaFuq      1     1     85      80.0 2.99 根本可愛動物區
#> 10       irenYujing      2     2     90      90.0 3.86 根本可愛動物區
#> 11         ying-shu      1     3     90      95.0 3.74 根本可愛動物區
#> 12           genius      2     2     75      95.0 3.00 根本可愛動物區
#> 13             dina      1     1     65      90.0 4.07       一代一代
#> 14       patricia C      1     2     70      50.0 4.19 根本可愛動物區
#> 15       Evan Huang      2     1     80      90.0 4.18 根本可愛動物區
#> 16       Emily Shih      1     2     80     100.0 4.00 根本可愛動物區
#> 17            Timmy      2     2     90      80.0 3.20 根本可愛動物區
#> 18             Shan      2     4     85      80.0 4.00 根本可愛動物區
#> 19 Shinomiya Kaguya      1     4    100      87.0 4.20 根本可愛動物區
#> 20         seashell      2     2     80      80.0 3.50 根本可愛動物區
#> 21               na      2     1    100     100.0 3.70 根本可愛動物區
#> 22            OhYah      2     3     60     100.0 4.23       一代一代
#> 23              TAT      1     4     75      70.0 3.00 根本可愛動物區
#> 24              QQQ      0     1    100     100.0 3.30 根本可愛動物區
#> 25            Mictu      2     4     70     100.0 4.30 根本可愛動物區
#> 26     1dai1dai1dai      1     1     87      99.0 4.10 根本可愛動物區
#> 27             Cate      2     4     80      90.0 3.90 根本可愛動物區
#> 28         otterson      1     5     99      75.0 4.30 根本可愛動物區
#> 29           Claire      2     2     75      80.0 3.50 根本可愛動物區
#> 30            NTUST      2     2     80      96.0 3.80 根本可愛動物區
#> 31      Anone Anone      2     4     85      80.0 4.10 根本可愛動物區
#> 32           annann      1     1     87      75.0 4.18 根本可愛動物區
#> 33             Kris      1     2     85      90.0 3.81 根本可愛動物區
#> 34          shinyue      1     4     70      95.0 4.03 根本可愛動物區
#> 35             adam      2     1    100     100.0 3.60 根本可愛動物區
#> 36         Clarissa      1     4     85     100.0 4.30 根本可愛動物區
#> 37                K      2     2     70      90.0 3.00 根本可愛動物區
#> 38            Jerry      2     1     65      80.0 4.00       一代一代
#> 39            jimmy      2     4     64      80.0 4.06       一代一代
#> 40    kobayashi rin      1     2     75      90.0 3.33 根本可愛動物區
#> 41           bulahi      2     4     60      80.0 4.10       一代一代
#> 42          Charles      2     1     61      99.9 3.58       一代一代
#> 43             meow      1     1     78      89.0 3.90 根本可愛動物區
#> 44            Henry      1     4     80     100.0 3.60 根本可愛動物區
#> 45            ariel      1     2     70      90.0 4.00 根本可愛動物區
#> 46           trumpy      0     4     87      99.0 4.00 根本可愛動物區
#> 47            bolee      2     1     70      90.0 3.13 根本可愛動物區
#> 48               mm      1     1     70      60.0 3.33 根本可愛動物區
#> 49            shawn      1     1     80     100.0 3.80 根本可愛動物區
#> 50        KaiSquare      2     3     90      90.0 3.50 根本可愛動物區
#> 51            SeanN      2     3     80     101.0 3.80 根本可愛動物區
#> 52          amychou      1     4     88     100.0 4.10 根本可愛動物區
#> 53          Chiwawa      2     4     60     100.0 3.99       一代一代
#> 54            lanhi      2     4     80      99.0 4.20 根本可愛動物區
#> 55               Wu      2     2     60      95.0 3.86       一代一代
#> 56            Jacky      2     4     50      80.0 3.50       一代一代
#> 57         meowmeow      1     1    100     100.0 4.30 根本可愛動物區
#> 58             eric      2     1     20     100.0 3.14       一代一代
#> 59                c      1     2     80      80.0 4.22 根本可愛動物區
#> 60               wu      1     2     80      90.0 4.10 根本可愛動物區
#> 61           bearly      2     5     80     100.0 2.70 根本可愛動物區
#> 62             baek      1     4     70      70.0 4.30 根本可愛動物區
#> 63             Boer      1     4     90     100.0 4.10 根本可愛動物區
#> 64            kappa      1     5     50      99.0 4.20       一代一代
#> 65              hhr      1     4     80      90.0 4.10 根本可愛動物區
#> 66              Lee      2     4     80      90.0 3.98 根本可愛動物區
#> 67              hhl      1     2     80     100.0 4.11 根本可愛動物區
#> 68     peanutbutter      1     1     60      90.0 2.96       一代一代
#> 69              sam      2     1     60     100.0 3.90       一代一代
#> 70       ilovesushi      2     2     87      90.0 3.75 根本可愛動物區
#> 71              rox      2     4     80      90.0 4.00 根本可愛動物區
#> 72        godiclili      2     3     30      80.0 4.25       一代一代
#> 73            afang      1     5     30      30.0 4.00       一代一代
#> 74           GodTon      2     5     60      90.0 2.00       一代一代
#> 75         seaotter      2     5     99      87.0 4.30 根本可愛動物區
#> 76  higannotabihito      2     5     30      87.0 3.50       一代一代
#> 77              wow      2     2    100      99.0 4.00 根本可愛動物區
#> 78            solid      1     5     85      90.0 3.90 根本可愛動物區
#> 79         87heng87      2     2     20      60.0 4.02       一代一代
#> 80          super q      2     3    100     100.0 4.29 根本可愛動物區
#> 81            kyaya      1     4     82      93.0 3.90 根本可愛動物區
#> 82              amy      2     3    100     100.0 0.00 根本可愛動物區
#> 83              kkk      1     4     80      90.0 3.70 根本可愛動物區
#> 84             kiki      2     2     10     100.0 5.00       一代一代
#> 85               KH      2     4     50     100.0 3.70       一代一代