【问题标题】:Creating gpa variable using mutate and pivot_longer使用 mutate 和 pivot_longer 创建 gpa 变量
【发布时间】:2021-04-15 15:54:12
【问题描述】:

我正在尝试找出最有效的方法来制作 GPA 变量,它只是学生成绩的平均值。问题是有些学生没有上完四门课,所以我不能把这些加起来除以 4。

对于以下数据,1 = A、2 = B、3 = C、4 = D 或更低。任何 5 或更高的值都应该被丢弃或有效地算作 NA。另外,我首先要重新编码字母等级,以便 4 = A、3 = B、3 = C、1 = D 或更低(我只需要 mutate)。

我第一次尝试使用 pivot_longer,但我很难处理缺失/不相关的值,而且似乎效率很低。获得每个学生个人 GPA 的最佳方法是什么?

structure(list(ID = c(1, 2, 3, 4, 
5, 6, 7, 8, 9, 10, 1, 
12, 13, 14, 15), grade_eng = c(98, 3, 
3, 2, 3, 1, 1, 3, 1, 2, 4, 1, 2, 1, 4), grade_math = c(5, 4, 
3, 3, 3, 1, 1, 3, 1, 5, 4, 2, 3, 2, 4), grade_hist = c(3, 3, 
4, 6, 2, 1, 2, 3, 1, 6, 2, 1, 1, 1, 4), grade_sci = c(3, 2, 4, 
3, 6, 2, 1, 2, 1, 3, 5, 2, 97, 2, 4)), row.names = c(NA, -15L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    我会使用pivot_longer() 将数据转换成更整洁的形式。然后,您可以使用 dplyr 包中的一些功能来做您想做的事。这些函数的好处是它们对它们的作用很直观。请注意,我不会将您的数字成绩数据重新编码为字母,因为在计算 GPA 时会汇总这些数据。

    library(tidyverse)
    
    gpa_df %>%
      pivot_longer(starts_with("grade"), names_to = "course", values_to = "grade") %>%
      filter(grade <= 4) %>%
      group_by(ID) %>%
      summarize(gpa = mean(grade))
    
    # A tibble: 15 x 2
          ID   gpa
       <dbl> <dbl>
     1     1  3   
     2     2  3   
     3     3  3.5 
     4     4  2.67
     5     5  2.67
     6     6  1.25
     7     7  1.25
     8     8  2.75
     9     9  1   
    10    10  2.5 
    11    11  3.33
    12    12  1.5 
    13    13  2   
    14    14  1.5 
    15    15  4   
    

    【讨论】:

      【解决方案2】:

      假设您有一个错字并且意味着第 11 行是 ID 11 而不是 1:

      library(dplyr)
      library(forcats)
      
      df %>%
        mutate(across(starts_with("grade"), ~ fct_rev(LETTERS[replace(., . > 4, NA)]))) %>%
        rowwise() %>%
        mutate(GPA = mean(as.numeric(c_across(starts_with("grade"))), na.rm = T)) %>% 
        ungroup() 
      
      1. 首先,我们使用replace(., . &gt; 4, NA) 将不相关的值替换为NA
      2. LETTERS 是一个基 R 向量,其中 LETTERS[1] 返回 "A" 等等。
      3. forcats::fct_rev 按字母倒序将值转换为因子。所以“D”是第一个因素,“C”是第二个因素,依此类推。
      4. 然后跨行(假设每一行是一个单独的ID)我们计算平均值,不包括NA

      输出

            ID grade_eng grade_math grade_hist grade_sci   GPA
         <dbl> <fct>     <fct>      <fct>      <fct>     <dbl>
       1     1 NA        NA         C          C          2   
       2     2 C         D          C          B          2   
       3     3 C         C          D          D          1.5 
       4     4 B         C          NA         C          2.33
       5     5 C         C          B          NA         2.33
       6     6 A         A          A          B          3.75
       7     7 A         A          B          A          3.75
       8     8 C         C          C          B          2.25
       9     9 A         A          A          A          4   
      10    10 B         NA         NA         C          2.5 
      11     1 D         D          B          NA         1.67
      12    12 A         B          A          B          3.5 
      13    13 B         C          A          NA         3   
      14    14 A         B          A          B          3.5 
      15    15 D         D          D          D          1 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        • 2018-10-03
        • 2018-09-28
        • 2016-03-11
        相关资源
        最近更新 更多